106 Commits

Author SHA1 Message Date
住京华
365d15d613 docs: add issue templates (#252) 2025-06-05 11:37:46 +08:00
住京华
42ffbcb198 fix: update CI configuration (#251) 2025-06-05 11:35:27 +08:00
github-actions[bot]
0835c86703 Merge pull request #248 from ZhuJHua/changelog-update-develop
Update changelog
2025-05-21 02:53:47 +00:00
github-actions[bot]
0ea780bf3c Update changelog on develop 2025-05-21 02:53:42 +00:00
住京华
29193190f6 fix: changelog update messages in CI configuration (#247) 2025-05-21 10:53:31 +08:00
github-actions[bot]
0fa5ba1486 Merge pull request #246 from ZhuJHua/changelog-update-develop
chore: update changelog
2025-05-21 02:36:10 +00:00
github-actions[bot]
921dcf67cd chore: update changelog on develop 2025-05-21 02:36:03 +00:00
住京华
7a73922b64 chore: bump Flutter version to 3.32.0 (#245)
* feat: update sharing functionality to use SharePlus for file sharing

* feat: upgrade Flutter SDK to version 3.32.0
2025-05-21 10:35:50 +08:00
github-actions[bot]
ea72c06479 Merge pull request #244 from ZhuJHua/changelog-update-develop
chore: update changelog
2025-05-21 02:22:29 +00:00
github-actions[bot]
695aec8bf0 chore: update changelog on develop 2025-05-21 02:22:24 +00:00
住京华
4a72a0b6c2 ci: update CI configuration (#243) 2025-05-21 10:22:11 +08:00
住京华
b8ce69011c feat(video): use ffmpeg as video backend (#241)
* chore(deps): update dependencies

* chore(deps): update dependencies

* fix: update ios and macos platform version

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* feat: add argon2 support

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* chore(deps): update deps

* feat(video): use ffmpeg as video backend

* fix(video): simplify video view invocation and improve button interaction

* feat(button): add customizable color option to PageBackButton

[skip ci]
2025-05-19 00:18:51 +08:00
住京华
4d93fe259b Merge pull request #240 from liruohrh/feat/ci_win
ci: add ci for windows
2025-05-13 14:58:39 +08:00
liruohrh
466a664157 fix(rust): new zip, use std::os::unix only in unix 2025-05-12 19:41:07 +08:00
liruohrh
7885b68415 ci: github actions for windows 2025-05-11 23:00:56 +08:00
github-actions[bot]
8ef72433eb Merge pull request #238 from ZhuJHua/changelog-update
Update changelog
2025-04-18 04:06:47 +00:00
github-actions[bot]
073e483112 Update changelog 2025-04-18 04:06:41 +00:00
住京华
967f652d9a Merge pull request #237 from ZhuJHua/develop
fix: qweather api error
2025-04-18 12:06:14 +08:00
ZhuJHua
64ca18ef44 fix: qweather api error
(cherry picked from commit 2e206a9335)
2025-04-18 12:02:41 +08:00
github-actions[bot]
c1948f888e Merge pull request #236 from ZhuJHua/changelog-update
Update changelog
2025-04-18 04:01:43 +00:00
github-actions[bot]
2b7f750b4c Update changelog 2025-04-18 04:01:39 +00:00
住京华
ef3f0270a6 Merge pull request #235 from ZhuJHua/develop
feat: integrate Jieba for keyword extraction and search optimization
2025-04-18 12:01:29 +08:00
ZhuJHua
8d9f380ec5 Revert "fix: qweather api error"
This reverts commit 2e206a9335.
2025-04-18 11:58:51 +08:00
ZhuJHua
2e206a9335 fix: qweather api error 2025-04-18 11:54:16 +08:00
ZhuJHua
f642530bca feat: integrate Jieba for keyword extraction and search optimization 2025-04-18 11:19:01 +08:00
github-actions[bot]
13e3dc1bb2 Merge pull request #234 from ZhuJHua/changelog-update
Update changelog
2025-04-17 03:51:56 +00:00
github-actions[bot]
ce319374a2 Update changelog 2025-04-17 03:51:50 +00:00
住京华
eee3cc03d8 Merge pull request #233 from ZhuJHua/develop
feat: optimize image processing capabilities
2025-04-17 11:51:40 +08:00
ZhuJHua
372678fa82 feat: optimize image processing capabilities 2025-04-17 11:41:41 +08:00
ZhuJHua
9b3757dea1 ci: add test module to lib.rs 2025-04-17 11:20:11 +08:00
ZhuJHua
cc4cee941d ci: update rust test ci 2025-04-17 11:15:48 +08:00
ZhuJHua
3be9f90575 chore(deps): update dependencies 2025-04-16 23:56:59 +08:00
github-actions[bot]
87a7af08ff Merge pull request #231 from ZhuJHua/changelog-update
Update changelog
2025-04-14 07:34:22 +00:00
github-actions[bot]
cf97917117 Update changelog 2025-04-14 07:34:17 +00:00
住京华
487972451c Merge pull request #230 from ZhuJHua/develop
feat: add code scanning to import support
2025-04-14 15:34:06 +08:00
ZhuJHua
2eb6ab7409 feat: add code scanning to import support 2025-04-14 15:30:23 +08:00
github-actions[bot]
f106154fe4 Merge pull request #229 from ZhuJHua/changelog-update
Update changelog
2025-04-13 13:42:42 +00:00
github-actions[bot]
9524193261 Update changelog 2025-04-13 13:42:36 +00:00
住京华
59346795ae Merge pull request #228 from ZhuJHua/develop
refactor: optimize the code structure
2025-04-13 21:42:24 +08:00
ZhuJHua
96682cb593 refactor: optimize the code structure 2025-04-13 21:36:41 +08:00
ZhuJHua
06b52fce5d chore(deps): update permission_handler and syncfusion_flutter_sliders versions 2025-04-09 23:54:58 +08:00
ZhuJHua
9edc55a6c8 chore(deps): update flutter_map_cache and flutter_native_splash versions 2025-04-07 23:57:58 +08:00
ZhuJHua
d25231c413 feat(widget): add utility functions to capture widget as image 2025-04-05 23:56:40 +08:00
ZhuJHua
6584cca855 chore(deps): update project configuration and dependencies 2025-04-02 23:58:59 +08:00
ZhuJHua
12e4e808da chore(deps): update project configuration and dependencies 2025-04-01 23:52:46 +08:00
ZhuJHua
3266d9f438 chore(deps): update project configuration and dependencies 2025-03-28 23:56:46 +08:00
ZhuJHua
c39f5b30f8 chore(deps): update project configuration and dependencies 2025-03-27 23:35:59 +08:00
ZhuJHua
d5e5b94607 chore(deps): update project configuration and dependencies 2025-03-25 22:34:00 +08:00
github-actions[bot]
ddb6d8f2db Merge pull request #221 from ZhuJHua/changelog-update
Update changelog
2025-03-22 21:55:31 +00:00
github-actions[bot]
a7f7601408 Update changelog 2025-03-22 21:55:27 +00:00
住京华
5edaf2f6cf Merge pull request #220 from ZhuJHua/develop
chore: remove custom_lint to fix dart analyzer slow
2025-03-23 05:55:15 +08:00
ZhuJHua
b274622006 chore: remove custom_lint to fix dart analyzer slow 2025-03-23 05:36:05 +08:00
github-actions[bot]
6de1968ddf Merge pull request #219 from ZhuJHua/changelog-update
Update changelog
2025-03-22 20:35:36 +00:00
github-actions[bot]
aeef1e511c Update changelog 2025-03-22 20:35:32 +00:00
住京华
9589dc9e54 Merge pull request #218 from ZhuJHua/develop
fix(share): fix capture and share methods
2025-03-23 04:35:20 +08:00
ZhuJHua
4abb85ad42 fix: remove workspace 2025-03-23 04:30:17 +08:00
ZhuJHua
f9f2056d04 fix(share): fix capture and share methods 2025-03-22 23:38:38 +08:00
ZhuJHua
182008a678 chore(deps): update isar_flutter_libs dependency to use git source 2025-03-22 23:22:57 +08:00
ZhuJHua
0b1a9bf4c8 chore(deps): update package versions 2025-03-21 23:58:26 +08:00
ZhuJHua
cd51e8922b chore(readme): update Flutter and Dart versions in documentation 2025-03-20 17:27:07 +08:00
github-actions[bot]
8c9fe08128 Merge pull request #214 from ZhuJHua/changelog-update
Update changelog
2025-03-19 15:32:33 +00:00
github-actions[bot]
8dc18c92cd Update changelog 2025-03-19 15:32:25 +00:00
住京华
2a9900556e Merge pull request #213 from ZhuJHua/develop
chore(deps): update dependencies to latest versions
2025-03-19 23:32:08 +08:00
ZhuJHua
0e46a830af chore(deps): update dependencies to latest versions 2025-03-19 23:27:42 +08:00
ZhuJHua
41709c8832 chore(deps): update dependencies to latest versions 2025-03-18 23:57:10 +08:00
住京华
316fa1119f Merge pull request #212
docs: update sponsor list
2025-03-16 21:23:46 +08:00
ZhuJHua
0df58eed05 docs: update sponsor list
[skip ci]
2025-03-16 21:23:19 +08:00
github-actions[bot]
7d936ac1c3 Merge pull request #211 from ZhuJHua/changelog-update
Update changelog
2025-03-16 12:56:57 +00:00
github-actions[bot]
4a1c2609ab Update changelog 2025-03-16 12:56:53 +00:00
住京华
28dc3e1114 Merge pull request #210 from ZhuJHua/develop
feat(zip): use rust to increase data export speed
2025-03-16 20:56:41 +08:00
ZhuJHua
cd78b4d64d chore(deps): fix library error 2025-03-16 20:53:58 +08:00
ZhuJHua
e32bb156fe chore(deps): remove unnecessary dependencies 2025-03-16 20:47:47 +08:00
ZhuJHua
ab8f40b98f chore(ci): remove redundant dependency installation for Rust builder 2025-03-16 20:22:45 +08:00
ZhuJHua
235f632670 feat(zip): use rust to increase data export speed 2025-03-16 20:18:47 +08:00
ZhuJHua
af3bf29139 chore(deps): use dart workspace 2025-03-16 20:14:58 +08:00
ZhuJHua
1afe59ac70 chore(deps): update dependencies 2025-03-16 00:03:53 +08:00
ZhuJHua
406e042411 chore(deps): update dependencies 2025-03-16 00:03:53 +08:00
ZhuJHua
8d95476d04 chore(deps): update dependencies 2025-03-16 00:03:52 +08:00
ZhuJHua
83049f598e chore(deps): update dependencies in pubspec.lock and pubspec.yaml 2025-03-16 00:03:52 +08:00
住京华
047a3ac576 Merge pull request #203 from ZhuJHua/develop
ci: fix build
2025-03-03 00:50:39 +08:00
ZhuJHua
fe2f29c939 ci: fix build
[skip ci]
2025-03-03 00:49:58 +08:00
住京华
c631636472 Merge pull request #202 from ZhuJHua/develop
ci: fix build error
2025-03-03 00:22:22 +08:00
github-actions[bot]
4ca93f15ca Merge pull request #201 from ZhuJHua/changelog-update
Update changelog
2025-03-02 16:17:45 +00:00
github-actions[bot]
9906d8c1af Update changelog 2025-03-02 16:17:42 +00:00
住京华
3a00ffa04f Merge pull request #200 from ZhuJHua/develop
feat: enhance diary card views with icons and improve page transitions
2025-03-03 00:17:30 +08:00
github-actions[bot]
b3b3f526b4 Merge pull request #199 from ZhuJHua/changelog-update
Update changelog
2025-03-02 15:32:10 +00:00
github-actions[bot]
1f438e5c52 Update changelog 2025-03-02 15:32:06 +00:00
住京华
c4f5cf7d96 Merge pull request #198 from ZhuJHua/develop
feat: add an abstract sync interface
2025-03-02 23:31:54 +08:00
github-actions[bot]
c424839453 Merge pull request #197 from ZhuJHua/changelog-update
Update changelog
2025-03-01 23:39:26 +00:00
github-actions[bot]
6d9489076e Update changelog 2025-03-01 23:39:22 +00:00
住京华
cb43f50ea5 Merge pull request #196 from ZhuJHua/develop
chore: update NDK and plugin versions in build configuration
2025-03-02 07:39:10 +08:00
github-actions[bot]
77b9bd5005 Merge pull request #195 from ZhuJHua/changelog-update
Update changelog
2025-03-01 23:23:13 +00:00
github-actions[bot]
7c6f704895 Update changelog 2025-03-01 23:23:10 +00:00
住京华
7ed54ddf95 Merge pull request #194 from ZhuJHua/develop
refactor: update tile caching implementation
2025-03-02 07:22:59 +08:00
github-actions[bot]
1671c3c770 Merge pull request #193 from ZhuJHua/changelog-update
Update changelog
2025-03-01 20:53:40 +00:00
github-actions[bot]
89f9045e30 Update changelog 2025-03-01 20:53:35 +00:00
住京华
80ad276634 Merge pull request #192 from ZhuJHua/develop
refactor: streamline theme management and dynamic color support
2025-03-02 04:53:20 +08:00
github-actions[bot]
8047c391b3 Merge pull request #189 from ZhuJHua/changelog-update
Update changelog
2025-02-24 04:18:21 +00:00
github-actions[bot]
ea053f5a73 Update changelog 2025-02-24 04:18:17 +00:00
住京华
31560b783f Merge pull request #188 from ZhuJHua/develop
fix: update diary_view to use Get.put for DiaryLogic instantiation
2025-02-24 12:18:05 +08:00
github-actions[bot]
fae6316f55 Merge pull request #187 from ZhuJHua/changelog-update
Update changelog
2025-02-23 13:55:23 +00:00
github-actions[bot]
63ba3c2b68 Update changelog 2025-02-23 13:55:18 +00:00
住京华
827fd89ddc Merge pull request #186 from ZhuJHua/develop
ci: fix cliff ci
2025-02-23 21:54:36 +08:00
住京华
84d1bb5802 Merge pull request #183 from ZhuJHua/develop
ci: improve ci
2025-02-23 21:51:00 +08:00
住京华
5b9ca30c95 Merge pull request #181 from ZhuJHua/develop
feat: add workflow_run trigger for Git Cliff completion
2025-02-23 21:28:53 +08:00
github-actions[bot]
348fe883ab Update changelog (#182) 2025-02-23 13:28:26 +00:00
352 changed files with 23235 additions and 13829 deletions

2
.fvmrc
View File

@@ -1,3 +1,3 @@
{
"flutter": "3.29.0"
"flutter": "3.32.0"
}

37
.github/ISSUE_TEMPLATE/bug.en.md vendored Normal file
View File

@@ -0,0 +1,37 @@
---
name: "\U0001F41B Bug Report"
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: ZhuJHua
---
## 🐛 Bug Description
A clear and concise description of what the bug is.
## 📝 Steps to Reproduce
1.
2.
3.
4.
## 🤔 Expected behavior
A clear description of what you expected to happen.
## 📱 Device Information
- Operating System: [e.g. iOS/Android]
- Device Model: [e.g. iPhone 16/Pixel 9]
- App Version: [e.g. v1.0.0]
## 🖼️ Screenshots
If applicable, add screenshots to help explain your problem.
## 🗒️ Additional context
Add any other context about the problem here.

38
.github/ISSUE_TEMPLATE/bug.zh.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: "\U0001F41B 异常报告"
about: 创建报告以帮助我们改善
title: "[BUG]"
labels: bug
assignees: ZhuJHua
---
## 🐛Bug 描述
请简要描述问题。
## 📝复现步骤
1.
2.
3.
4.
## 🤔预期行为
简要描述你期望发生的事情。
## 📱设备信息
- 操作系统: [e.g. iOS/Android]
- 设备型号: [e.g. iPhone 16/Pixel 9]
- App 版本: [e.g. v1.0.0]
## 🖼️截图
如果有帮助的话,请附上相关截图。
## 🗒️其他信息
关于问题的其他信息。

28
.github/ISSUE_TEMPLATE/feat.en.md vendored Normal file
View File

@@ -0,0 +1,28 @@
---
name: "\U0001F4A1 Feature request"
about: Suggest an idea for this project
title: "[Feature]"
labels: enhancement
assignees: ZhuJHua
---
## 💡Feature Request
A clear and concise description of the feature you'd like to be added.
## 🤔What problem does this feature solve?
Explain why this feature would be useful or what problem it solves.
## 📑Implementation Details (optional)
If you have any ideas on how to implement it, please provide details.
## 📱Relevant Platforms
- Platform: [e.g. iOS/Android]
## 🗒️ Additional context
Add any other context or screenshots about the feature request here.

29
.github/ISSUE_TEMPLATE/feat.zh.md vendored Normal file
View File

@@ -0,0 +1,29 @@
---
name: "\U0001F4A1 新功能请求"
about: 为项目提出一个想法
title: "[Feature]"
labels: enhancement
assignees: ZhuJHua
---
## 💡新功能请求
请简要描述你希望添加的功能。
## 🤔这个功能能解决什么问题?
解释该功能的必要性。
## 📑实现细节(可选)
如果你有任何实现细节,请提供。
## 📱相关平台
- 平台: [e.g. iOS/Android]
## 🗒️其他信息
关于此功能的其他信息。

View File

@@ -1,45 +0,0 @@
---
name: "\U0001F41B 异常报告 | Bug Report"
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: ZhuJHua
---
## 🐛 Bug 描述 | Bug Description
请简要描述问题。
A clear and concise description of what the bug is.
## 📝 复现步骤 | Steps to Reproduce
1.
2.
3.
4.
## 🤔 预期行为 | Expected behavior
简要描述你期望发生的事情。
A clear description of what you expected to happen.
## 📱 设备信息 | Device Information
- 操作系统: [e.g. iOS/Android]
- 设备型号: [e.g. iPhone 12/Pixel 5]
- App 版本: [e.g. v1.0.0]
## 🖼️ 截图 | Screenshots
如果有帮助的话,请附上相关截图。
If applicable, add screenshots to help explain your problem.
## 🗒️ 其他信息 | Additional context
关于问题的其他信息。
Add any other context about the problem here.

View File

@@ -1,37 +0,0 @@
---
name: "\U0001F4A1新功能请求 | Feature request"
about: Suggest an idea for this project
title: "[Feature]"
labels: enhancement
assignees: ZhuJHua
---
## 💡 新功能请求 | Feature Request
请简要描述你希望添加的功能。
A clear and concise description of the feature you'd like to be added.
## 🤔 这个功能能解决什么问题?| What problem does this feature solve?
解释该功能的必要性。
Explain why this feature would be useful or what problem it solves.
## 📑 实现细节(可选)| Implementation Details (optional)
如果你有任何实现细节,请提供。
If you have any ideas on how to implement it, please provide details.
## 📱 相关设备/平台 | Relevant Devices/Platforms
- 平台: [e.g. iOS/Android]
- 相关版本: [e.g. v1.0.0]
## 🗒️ 其他信息 | Additional context
关于此功能的其他信息。
Add any other context or screenshots about the feature request here.

View File

@@ -2,6 +2,9 @@ name: Build & Release
on:
workflow_dispatch:
push:
tags:
- 'v*.*.*'
jobs:
build-apk:
@@ -38,6 +41,13 @@ jobs:
with:
flutter-version: ${{ env.flutter-version }}
- name: Set Up Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Install Dependencies
run: flutter pub get
@@ -58,22 +68,81 @@ jobs:
with:
name: android-apk
path: build/app/outputs/flutter-apk/app-release.apk
build-windows:
runs-on: windows-latest
name: Build Windows
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set Up Java
uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "21"
- name: Read Flutter Version
id: flutter_version
run: |
if (Test-Path .fvmrc) {
$FLUTTER_VERSION = (Get-Content .fvmrc | ConvertFrom-Json).flutter
echo "Flutter version detected: $FLUTTER_VERSION"
echo "flutter-version=$FLUTTER_VERSION" >> $env:GITHUB_ENV
} else {
echo ".fvmrc not found. Defaulting to latest Flutter version."
echo "flutter-version=stable" >> $env:GITHUB_ENV
}
- name: Set Up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.flutter-version }}
- name: Set Up Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Install Dependencies
run: flutter pub get
- name: Build Windows
run: flutter build windows --release
- name: Create ZIP Archive
run: |
Compress-Archive -Path build\windows\x64\runner\Release\* -DestinationPath build\windows\moodiary-windows.zip
- name: Upload Windows Artifact
uses: actions/upload-artifact@v4
with:
name: windows-app
path: build\windows\moodiary-windows.zip
release:
runs-on: ubuntu-latest
name: Publish Release
needs: [ build-apk ]
needs: [ build-apk, build-windows ]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Download APK Artifact
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4
with:
name: android-apk
path: artifacts/android
- name: Download Windows Artifact
uses: actions/download-artifact@v4
with:
name: windows-app
path: artifacts/windows
- name: Get Latest Tag
id: latest_tag
uses: actions-ecosystem/action-get-latest-tag@v1.6.0
@@ -92,6 +161,7 @@ jobs:
run: |
mkdir -p renamed-artifacts
mv artifacts/android/app-release.apk renamed-artifacts/moodiary-${{ env.VERSION }}-android-arm64.apk
mv artifacts/windows/moodiary-windows.zip renamed-artifacts/moodiary-${{ env.VERSION }}-windows-x64.zip
- name: Generate Release Notes
id: release_notes

28
.github/workflows/cargo-ci.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: Cargo CI
on:
workflow_dispatch:
pull_request:
branches:
- develop
jobs:
test:
name: Run Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Run cargo test
working-directory: rust
run: cargo test
- name: Fail on Errors
if: failure()
run: exit 1

View File

@@ -1,57 +1,47 @@
name: Git Cliff
on:
pull_request:
branches:
- master
types:
- closed
workflow_dispatch:
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check if PR is merged
run: |
if [ "${{ github.event.pull_request.merged }}" == "true" ]; then
echo "PR is merged, proceeding with changelog update."
else
echo "PR is not merged, skipping changelog update."
exit 0
fi
- name: Generate changelog using Git Cliff
uses: orhun/git-cliff-action@v4
with:
config: cliff.toml
args: --verbose
env:
OUTPUT: CHANGELOG.md
GITHUB_REPO: ${{ github.repository }}
- name: Commit and push changelog changes
run: |
git checkout -b changelog-update
git config user.name 'github-actions[bot]'
git config user.email 'github-actions[bot]@users.noreply.github.com'
git add CHANGELOG.md
git commit -m "Update changelog"
git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git changelog-update
- name: Create Pull Request
run: |
gh pr create --base master --head changelog-update --title "Update changelog" --body "This PR updates the changelog based on recent changes." --label bot
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Auto Merge Pull Request
run: |
gh pr merge --merge --delete-branch "changelog-update"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#name: Git Cliff (master)
#
#on:
# push:
# tags:
# - 'v*.*.*'
#
#jobs:
# changelog:
# runs-on: ubuntu-latest
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# with:
# fetch-depth: 0
#
# - name: Generate changelog using Git Cliff
# uses: orhun/git-cliff-action@v4
# with:
# config: cliff.toml
# args: --verbose
# env:
# OUTPUT: CHANGELOG.md
# GITHUB_REPO: ${{ github.repository }}
#
# - name: Commit and push changelog changes
# run: |
# git checkout master
# git pull origin master
# git checkout -b changelog-update-${{ github.ref_name }}
# git config user.name 'github-actions[bot]'
# git config user.email 'github-actions[bot]@users.noreply.github.com'
# git add CHANGELOG.md
# git commit -m "Update changelog for ${{ github.ref_name }}"
# git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git changelog-update-${{ github.ref_name }}
#
# - name: Create Pull Request
# run: |
# gh pr create --base master --head changelog-update-${{ github.ref_name }} --title "Update changelog for ${{ github.ref_name }}" --body "This PR updates the changelog for release ${{ github.ref_name }}." --label bot
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#
# - name: Auto Merge Pull Request
# run: |
# gh pr merge --merge --delete-branch changelog-update-${{ github.ref_name }}
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -4,7 +4,7 @@ on:
workflow_dispatch:
pull_request:
branches:
- master
- develop
jobs:
flutter-ci:
@@ -38,14 +38,6 @@ jobs:
- name: Install Dependencies
run: flutter pub get
- name: Install Dependencies for Rust Builder Project
working-directory: rust_builder
run: flutter pub get
- name: Install Dependencies for Rust Builder Project (subdirectory)
working-directory: rust_builder/cargokit/build_tool
run: flutter pub get
- name: Run Flutter Analyze
run: flutter analyze

1
.gitignore vendored
View File

@@ -43,6 +43,7 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release
/ios/build
# FVM Version Cache
.fvm/

View File

@@ -6,6 +6,47 @@ All notable changes to this project will be documented in this file.
### 🚀 Features
- *(zip)* Use rust to increase data export speed
- *(widget)* Add utility functions to capture widget as image
- Add code scanning to import support
- Optimize image processing capabilities
- Integrate Jieba for keyword extraction and search optimization
- *(video)* Use ffmpeg as video backend (#241)
### 🐛 Bug Fixes
- *(share)* Fix capture and share methods
- Remove workspace
- Qweather api error
- Qweather api error
- *(rust)* New zip, use `std::os::unix` only in unix
- Changelog update messages in CI configuration (#247)
### 🚜 Refactor
- Optimize the code structure
### 📚 Documentation
- Update sponsor list
### ⚙️ Miscellaneous Tasks
- Fix build
- *(ci)* Remove redundant dependency installation for Rust builder
- Remove custom_lint to fix dart analyzer slow
- Update rust test ci
- Add test module to lib.rs
- Github actions for windows
- Update CI configuration (#243)
- Update changelog on develop
- Bump Flutter version to 3.32.0 (#245)
- Update changelog on develop
## [2.7.3] - 2025-03-02
### 🚀 Features
- *(telegram-bot)* Enhance release notification workflow
- *(telegram-bot)* Enhance release notification workflow
- *(llama)* Add LlamaUtil class and update dependencies
@@ -24,8 +65,11 @@ All notable changes to this project will be documented in this file.
- Enhance image viewing experience with hero transitions and loading states
- Improve image handling with enhanced hero transitions and dynamic sizing
- Add WindowsBar and MoveTitle widgets for improved window management
- Improve UI consistency
- Improve UI components
- Enhance UI and improve desktop experience (#179)
- Add workflow_run trigger for Git Cliff completion
- Update changelog workflow to check PR merge status before generating changelog
- Add an abstract sync interface
- Enhance diary card views with icons and improve page transitions
### 🐛 Bug Fixes
@@ -37,6 +81,8 @@ All notable changes to this project will be documented in this file.
- Update localization configuration to include synthetic package option
- Update dependencies and remove unused localization imports
- Ci (#177)
- Correct syntax for workflow_run trigger in auto-merge.yml
- Update diary_view to use Get.put for DiaryLogic instantiation
### 💼 Other
@@ -46,6 +92,8 @@ All notable changes to this project will be documented in this file.
- Rename rust library from rust_lib_mood_diary to moodiary_rust
- Remove video page routing and update video state initialization
- Streamline theme management and dynamic color support
- Remove Objectbox plugin references and update tile caching implementation
### ⚙️ Miscellaneous Tasks
@@ -68,7 +116,12 @@ All notable changes to this project will be documented in this file.
- Add git-cliff to generate changelog
- Add git-cliff to generate changelog
- Add git-cliff to generate changelog
- Update smooth_page_indicator to version 1.2.1
- Upgrade actions/checkout to v4 across workflow files
- Fix cliff ci
- Update dependencies in pubspec.yaml to latest versions
- Update NDK and plugin versions in build configuration
- Update .gitignore
- *(fix build error)* [skip ci]
## [2.7.2] - 2025-01-27
@@ -123,7 +176,6 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- *(flutter)* Update flutter version to 3.27.2
- *(readme)* Update readme for new features and improvements
- Simplify telegram release notification
- *(ci)* Enhance telegram notification with release details
- Refine release notification workflow
@@ -166,7 +218,6 @@ All notable changes to this project will be documented in this file.
- *(ci)* Install dependencies for rust builder project in flutter analyze workflow
- *(workflow)* Update flutter analyze workflow
- *(ci)* Add dependency installation step for rust builder
- *(readme)* Update screenshots for different languages
- *(*)* Bump version to 2.7.1+71
## [2.7.0] - 2025-01-17

View File

@@ -8,13 +8,14 @@
<p align="center"><a href="https://answer.moodiary.net" target="_blank">Official forum</a>丨QQ Group: <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=xGr0TNp_X1z3XEn09_iE_iGSLolQwl6Y&jump_from=webapi&authKey=ZmSb2oEd94FSXxBXRBq53hgTjjvcfmgkQrduB3uL12XtRylPmRlO2OdFz6R25tIo">760014526</a>丨Telegram: <a target="_blank" href="https://t.me/openmoodiary">openmoodiary</a></p>
<div align="center">
<img src="https://img.shields.io/badge/Flutter-3.27.3-blue?style=for-the-badge">
<img src="https://img.shields.io/badge/Flutter-3.29.2-blue?style=for-the-badge">
<img src="https://img.shields.io/github/repo-size/ZhuJHua/moodiary?style=for-the-badge&color=ff7070">
<img src="https://img.shields.io/github/stars/ZhuJHua/moodiary?style=for-the-badge&color=965f8a">
<img src="https://img.shields.io/github/v/release/ZhuJHua/moodiary?style=for-the-badge&color=4f5e7f">
<img src="https://img.shields.io/github/license/ZhuJHua/moodiary?style=for-the-badge&color=4ac6b7">
</div>
## ✨ Feature
- **Cross-platform support**: 🌍 Compatible with Android, iOS, Windows, MacOS, Linux\*.
@@ -77,7 +78,7 @@ Some capabilities need to apply for third-party SDKS, and the following service
- [Tencent Hunyuan](https://cloud.tencent.com/document/product/1729/97731)
### Direct mounting
### Direct install
Use it by downloading the compiled installation package in Release, or manually compiling it if you don't have the platform you need.
@@ -87,9 +88,9 @@ Use it by downloading the compiled installation package in Release, or manually
> I always use the latest Flutter version (if possible), using newer versions will bring more features and better performance improvements, never use older versions unless you want your code to become a piece of 💩
- Flutter SDK (>= 3.27.0 Stable) (It is recommended to use FVM to manage the Flutter version)
- Dart (>= 3.6.0)
- Rust Toolchain
- Flutter SDK (>= 3.29.0 Stable) (It is recommended to use FVM to manage the Flutter version)
- Dart (>= 3.7.0)
- Rust Toolchain (Nightly)
- Clang/LLVM
- Compatible IDE (e.g. Android Studio, Visual Studio Code)
@@ -172,13 +173,16 @@ You can buy me a sandwich to keep me motivated to continue developing.
### List of sponsors
If you want to be on the list, you can leave me a message, in no particular order, and the list will be updated regularly.
If you want to appear on the list, you can leave your Github username in the comment, in no particular order, and the list will be updated regularly.
| Sponsor | Price | Sponsor | Price |
|-----------------------------------| -------- | ------------------------------------------------ | ------ |
| [dsxksss](https://github.com/dsxksss) | 50 CNY | 十 | 20 CNY |
| 沭飏秋 | 10 CNY | 朱东杰 | 60 CNY |
| 匿名 | 5 CNY | wu | 10 CNY |
| 云 | 2.76 CNY | 不对味的雪碧 | 10 CNY |
| wireless | 6.6 CNY | [帕斯卡的芦苇](https://github.com/xiaoxianzi-99) | 10 CNY |
| 不歪猫 | 20 CNY | 曾祥军 | 20 CNY |
| [dsxksss](https://github.com/dsxksss) | 50 CNY | 十* | 20 CNY |
| 沭** | 10 CNY | 朱东杰 | 60 CNY |
| *Person* | 5 CNY | wu* | 10 CNY |
| 云* | 2.76 CNY | 不对味的雪碧 | 10 CNY |
| w** | 6.6 CNY | [帕斯卡的芦苇](https://github.com/xiaoxianzi-99) | 10 CNY |
| 不** | 20 CNY | 曾** | 20 CNY |
| *Person* | 20 CNY | *Person* | 18.88 CNY |
| Lucci | 9.9 CNY | *Person* | 5 CNY |
| 宋** | 5 CNY | 翰** | 5 CNY |

View File

@@ -8,7 +8,7 @@
<p align="center"><a href="https://answer.moodiary.net" target="_blank">官方论坛</a>丨QQ群: <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=xGr0TNp_X1z3XEn09_iE_iGSLolQwl6Y&jump_from=webapi&authKey=ZmSb2oEd94FSXxBXRBq53hgTjjvcfmgkQrduB3uL12XtRylPmRlO2OdFz6R25tIo">760014526</a>丨Telegram: <a target="_blank" href="https://t.me/openmoodiary">openmoodiary</a></p>
<div align="center">
<img src="https://img.shields.io/badge/Flutter-3.27.3-blue?style=for-the-badge">
<img src="https://img.shields.io/badge/Flutter-3.29.2-blue?style=for-the-badge">
<img src="https://img.shields.io/github/repo-size/ZhuJHua/moodiary?style=for-the-badge&color=ff7070">
<img src="https://img.shields.io/github/stars/ZhuJHua/moodiary?style=for-the-badge&color=965f8a">
<img src="https://img.shields.io/github/v/release/ZhuJHua/moodiary?style=for-the-badge&color=4f5e7f">
@@ -16,6 +16,7 @@
</div>
## ✨ 功能特性
- **跨平台支持**:🌍 兼容 Android、iOS、Windows、MacOS、Linux\*。
@@ -88,9 +89,9 @@
> 我总是会使用最新的 Flutter 版本(如果可能的话),使用新版本可以带来更多的功能和更好的性能提升,永远不要使用老版本除非你希望代码变成一坨 💩
- Flutter SDK (>= 3.27.0 Stable)(建议使用 fvm 来管理 flutter 版本)
- Dart (>= 3.6.0)
- Rust 工具链
- Flutter SDK (>= 3.29.0 Stable)(建议使用 fvm 来管理 flutter 版本)
- Dart (>= 3.7.0)
- Rust 工具链Nightly
- Clang/LLVM
- 兼容的 IDE如 Android Studio、Visual Studio Code
@@ -173,13 +174,16 @@ flutter run
### 捐助者名单
如果您想要出现在名单中,可以给我留言,排名不分先后,名单会定期更新。
如果您想要出现在名单中,可以在留言中留下您的 Github 用户名,排名不分先后,名单会定期更新。
| 捐助者 | 金额 | 捐助者 | 金额 |
| ------------------------------------- | -------- | ------------ | ------ |
| [dsxksss](https://github.com/dsxksss) | 50 CNY | 十 | 20 CNY |
| 沭飏秋 | 10 CNY | 朱东杰 | 60 CNY |
| 匿名 | 5 CNY | wu | 10 CNY |
| 云 | 2.76 CNY | 不对味的雪碧 | 10 CNY |
| wireless | 6.6 CNY | 帕斯卡的芦苇 | 10 CNY |
| 不歪猫 | 20 CNY | 曾祥军 | 20 CNY |
| 捐助者 | 金额 | 捐助者 | 金额 |
| ------------------------------------- | -------- | ------------------------------------------------ | --------- |
| [dsxksss](https://github.com/dsxksss) | 50 CNY | 十* | 20 CNY |
| 沭** | 10 CNY | 朱东杰 | 60 CNY |
| *人* | 5 CNY | wu* | 10 CNY |
| 云* | 2.76 CNY | 不对味的雪碧 | 10 CNY |
| w** | 6.6 CNY | [帕斯卡的芦苇](https://github.com/xiaoxianzi-99) | 10 CNY |
| 不** | 20 CNY | 曾** | 20 CNY |
| *人* | 20 CNY | *人* | 18.88 CNY |
| Lucci | 9.9 CNY | *人* | 5 CNY |
| 宋** | 5 CNY | 翰** | 5 CNY |

View File

@@ -1,25 +1,6 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
prefer_const_constructors: true
prefer_const_literals_to_create_immutables: true
@@ -29,7 +10,15 @@ linter:
prefer_final_locals: true
analyzer:
plugins:
- custom_lint
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
exclude:
- "**/*.g.dart"
- "**/*.freezed.dart"
- "**/*.gr.dart"
- "**/*.mocks.dart"
- "rust_builder/**"
- "ios/**"
- "android/**"
- "windows/**"
- "macos/**"
errors:
invalid_annotation_target: ignore

View File

@@ -24,7 +24,7 @@ if (flutterVersionName == null) {
android {
namespace = "cn.yooss.moodiary"
compileSdk = 35
compileSdk = 36
ndkVersion = "28.0.13004108"
compileOptions {
@@ -51,7 +51,7 @@ android {
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = 26
targetSdk = 35
targetSdk = 36
versionCode = flutterVersionCode.toInteger()
versionName = flutterVersionName
ndk {
@@ -68,9 +68,8 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
signingConfig = signingConfigs.config
resValue "string", "app_name", "Moodiary Debug"
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
}

View File

@@ -22,8 +22,8 @@ subprojects {
if (project.plugins.hasPlugin("com.android.application") ||
project.plugins.hasPlugin("com.android.library")) {
project.android {
compileSdkVersion 35
buildToolsVersion "35.0.0"
compileSdkVersion 36
buildToolsVersion "36.0.0"
}
}
if (project.hasProperty("android")) {

View File

@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.10.2-all.zip
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-all.zip

View File

@@ -25,8 +25,8 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version '8.8.2' apply false
id "org.jetbrains.kotlin.android" version "2.1.10" apply false
id "com.android.application" version '8.9.1' apply false
id "org.jetbrains.kotlin.android" version "2.1.20" apply false
}
include ":app"

19
build.yaml Normal file
View File

@@ -0,0 +1,19 @@
targets:
$default:
builders:
json_serializable:
options:
any_map: false
checked: false
constructor: ""
create_factory: true
create_field_map: false
create_json_keys: false
create_per_field_to_json: false
create_to_json: true
disallow_unrecognized_keys: false
explicit_to_json: false
field_rename: none
generic_argument_factories: false
ignore_unannotated: false
include_if_null: false

View File

@@ -74,6 +74,7 @@ commit_parsers = [
{ message = "^chore\\(deps.*\\)", skip = true },
{ message = "^chore\\(pr\\)", skip = true },
{ message = "^chore\\(pull\\)", skip = true },
{ message = "^chore\\(readme\\)", skip = true },
{ message = "^chore|^ci", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },

View File

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

View File

@@ -1,3 +1,4 @@
rust_input: crate::api
rust_root: rust/
dart_output: lib/src/rust
dart_output: lib/src/rust
web: false

View File

@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
platform :ios, '18.2'
platform :ios, '15.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

View File

@@ -61,15 +61,19 @@ PODS:
- Flutter
- flutter_native_splash (2.4.3):
- Flutter
- flutter_secure_storage (6.0.0):
- flutter_secure_storage_darwin (10.0.0):
- Flutter
- fluttertoast (0.0.2):
- FlutterMacOS
- fvp (0.31.2):
- Flutter
- FlutterMacOS
- mdk (~> 0.32.0)
- gal (1.0.0):
- Flutter
- FlutterMacOS
- geolocator_apple (1.2.0):
- Flutter
- FlutterMacOS
- image_picker_ios (0.0.1):
- Flutter
- isar_flutter_libs (1.0.0):
@@ -92,20 +96,14 @@ PODS:
- Mantle (2.2.0):
- Mantle/extobjc (= 2.2.0)
- Mantle/extobjc (2.2.0)
- media_kit_libs_ios_video (1.0.4):
- Flutter
- media_kit_native_event_loop (1.0.0):
- Flutter
- media_kit_video (0.0.1):
- mdk (0.32.0)
- mobile_scanner (7.0.0):
- Flutter
- FlutterMacOS
- moodiary_rust (0.0.1):
- Flutter
- network_info_plus (0.0.1):
- Flutter
- ObjectBox (4.1.0)
- objectbox_flutter_libs (0.0.1):
- Flutter
- ObjectBox (= 4.1.0)
- OrderedSet (6.0.3)
- package_info_plus (0.4.5):
- Flutter
@@ -116,11 +114,7 @@ PODS:
- Flutter
- quill_native_bridge_ios (0.0.1):
- Flutter
- record_darwin (1.0.0):
- Flutter
- rive_common (0.0.1):
- Flutter
- screen_brightness_ios (0.1.0):
- record_ios (1.0.0):
- Flutter
- SDWebImage (5.19.7):
- SDWebImage/Core (= 5.19.7)
@@ -164,8 +158,6 @@ PODS:
- video_player_avfoundation (0.0.1):
- Flutter
- FlutterMacOS
- volume_controller (0.0.1):
- Flutter
- wakelock_plus (0.0.1):
- Flutter
@@ -181,33 +173,27 @@ DEPENDENCIES:
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- flutter_keyboard_visibility_temp_fork (from `.symlinks/plugins/flutter_keyboard_visibility_temp_fork/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`)
- fvp (from `.symlinks/plugins/fvp/darwin`)
- gal (from `.symlinks/plugins/gal/darwin`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`)
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
- media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`)
- media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`)
- media_kit_video (from `.symlinks/plugins/media_kit_video/ios`)
- mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`)
- moodiary_rust (from `.symlinks/plugins/moodiary_rust/ios`)
- network_info_plus (from `.symlinks/plugins/network_info_plus/ios`)
- objectbox_flutter_libs (from `.symlinks/plugins/objectbox_flutter_libs/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- quill_native_bridge_ios (from `.symlinks/plugins/quill_native_bridge_ios/ios`)
- record_darwin (from `.symlinks/plugins/record_darwin/ios`)
- rive_common (from `.symlinks/plugins/rive_common/ios`)
- screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`)
- record_ios (from `.symlinks/plugins/record_ios/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
- tflite_flutter (from `.symlinks/plugins/tflite_flutter/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- volume_controller (from `.symlinks/plugins/volume_controller/ios`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
SPEC REPOS:
@@ -216,7 +202,7 @@ SPEC REPOS:
- DKPhotoGallery
- libwebp
- Mantle
- ObjectBox
- mdk
- OrderedSet
- SDWebImage
- SDWebImageWebPCoder
@@ -247,32 +233,26 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_keyboard_visibility_temp_fork/ios"
flutter_native_splash:
:path: ".symlinks/plugins/flutter_native_splash/ios"
flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios"
fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios"
flutter_secure_storage_darwin:
:path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin"
fvp:
:path: ".symlinks/plugins/fvp/darwin"
gal:
:path: ".symlinks/plugins/gal/darwin"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/ios"
:path: ".symlinks/plugins/geolocator_apple/darwin"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
isar_flutter_libs:
:path: ".symlinks/plugins/isar_flutter_libs/ios"
local_auth_darwin:
:path: ".symlinks/plugins/local_auth_darwin/darwin"
media_kit_libs_ios_video:
:path: ".symlinks/plugins/media_kit_libs_ios_video/ios"
media_kit_native_event_loop:
:path: ".symlinks/plugins/media_kit_native_event_loop/ios"
media_kit_video:
:path: ".symlinks/plugins/media_kit_video/ios"
mobile_scanner:
:path: ".symlinks/plugins/mobile_scanner/darwin"
moodiary_rust:
:path: ".symlinks/plugins/moodiary_rust/ios"
network_info_plus:
:path: ".symlinks/plugins/network_info_plus/ios"
objectbox_flutter_libs:
:path: ".symlinks/plugins/objectbox_flutter_libs/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
@@ -281,12 +261,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/permission_handler_apple/ios"
quill_native_bridge_ios:
:path: ".symlinks/plugins/quill_native_bridge_ios/ios"
record_darwin:
:path: ".symlinks/plugins/record_darwin/ios"
rive_common:
:path: ".symlinks/plugins/rive_common/ios"
screen_brightness_ios:
:path: ".symlinks/plugins/screen_brightness_ios/ios"
record_ios:
:path: ".symlinks/plugins/record_ios/ios"
share_plus:
:path: ".symlinks/plugins/share_plus/ios"
shared_preferences_foundation:
@@ -299,13 +275,11 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios"
video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
volume_controller:
:path: ".symlinks/plugins/volume_controller/ios"
wakelock_plus:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
app_links: 3da4c36b46cac3bf24eb897f1a6ce80bda109874
app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
audioplayers_darwin: ccf9c770ee768abb07e26d90af093f7bab1c12ab
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
@@ -317,31 +291,26 @@ SPEC CHECKSUMS:
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
flutter_keyboard_visibility_temp_fork: 95b2d534bacf6ac62e7fcbe5c2a9e2c2a17ce06f
flutter_native_splash: 6cad9122ea0fad137d23137dd14b937f3e90b145
flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
flutter_secure_storage_darwin: ce237a8775b39723566dc72571190a3769d70468
fvp: 89275776efede62b7fde1762afa518974e6d6750
gal: baecd024ebfd13c441269ca7404792a7152fde89
geolocator_apple: 1560c3c875af2a412242c7a923e15d0d401966ff
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
isar_flutter_libs: 9fc2cfb928c539e1b76c481ba5d143d556d94920
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
media_kit_native_event_loop: 5fba1a849a6c87a34985f1e178a0de5bd444a0cf
media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
mdk: a726c85fd49c002b83d586b278d452f387750889
mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93
moodiary_rust: e75b3fb63e53d3ba5cfed0edf0b6df5f98c4c5f1
network_info_plus: cf61925ab5205dce05a4f0895989afdb6aade5fc
ObjectBox: bf3d4b51075d52868422d5d1f2f2141b1d630d30
objectbox_flutter_libs: e912f15beff5699f1e184dbd2ff6aa5657464e73
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
quill_native_bridge_ios: f47af4b14e7757968486641656c5d23250cee521
record_darwin: fb1f375f1d9603714f55b8708a903bbb91ffdb0a
rive_common: dd421daaf9ae69f0125aa761dd96abd278399952
screen_brightness_ios: 5ed898fa50fa82a26171c086ca5e28228f932576
record_ios: fee1c924aa4879b882ebca2b4bce6011bcfc3d8b
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
@@ -353,9 +322,8 @@ SPEC CHECKSUMS:
tflite_flutter: 64b192e11352fe36943ab6656e1d49207f1a5595
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
volume_controller: ca1cde542ee70fad77d388f82e9616488110942b
wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
PODFILE CHECKSUM: 9752b5340b4d3f9618318fcd530d907790e2a9f5
PODFILE CHECKSUM: ed22e19af5eb4a72710862041c4be54584bcf797
COCOAPODS: 1.16.2

View File

@@ -7,15 +7,15 @@
objects = {
/* Begin PBXBuildFile section */
10D3882531AED19DB670FEB7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2698D5B078302CF0E4E6EE6 /* Pods_RunnerTests.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
306627225710E691EF0E0A35 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1A8341695BDC0741989253 /* Pods_Runner.framework */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
7F6D40933C7341CBD11FBDD8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51E3DDEC08B33FD4E6BEE95D /* Pods_RunnerTests.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
FE9916AC13415D97E045D776 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E85B5AB729F0B2360835644 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -42,31 +42,31 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
132767BCEC59ECA2C27AAF55 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
2A1A8341695BDC0741989253 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
18106D637ED786D29FE68004 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
51E3DDEC08B33FD4E6BEE95D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
481FF39ABA9170A968D00D47 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7D210E37B46E2650FA945AB1 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
8E85B5AB729F0B2360835644 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9F8B7E7E836FBA71F1E2767D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
A910B4CF2D4C960600C998E7 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = "<group>"; };
A910B4D02D4C960600C998E7 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
A910B4D12D4C961C00C998E7 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = "zh-Hans"; path = "zh-Hans.lproj/Main.storyboard"; sourceTree = "<group>"; };
A910B4D22D4C961C00C998E7 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.storyboard"; sourceTree = "<group>"; };
D3787A842552CCA621630495 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
D73569CF22DB2A16EAE0220D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
E231F0C855BB3DD103DA44E9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
E7AEAE59248BEA6C8378B114 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
E913EDBE59656A0E8EB14DDA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
D0CBE1B7A5C3D8E84DECC981 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
F2698D5B078302CF0E4E6EE6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
FD54B3E6C9A9278793818CA8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -74,7 +74,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
306627225710E691EF0E0A35 /* Pods_Runner.framework in Frameworks */,
FE9916AC13415D97E045D776 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -82,22 +82,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
7F6D40933C7341CBD11FBDD8 /* Pods_RunnerTests.framework in Frameworks */,
10D3882531AED19DB670FEB7 /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
32F89EBD1A567B14B95A803E /* Frameworks */ = {
isa = PBXGroup;
children = (
2A1A8341695BDC0741989253 /* Pods_Runner.framework */,
51E3DDEC08B33FD4E6BEE95D /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
@@ -109,12 +100,12 @@
4358F1D645E2BE879D24A551 /* Pods */ = {
isa = PBXGroup;
children = (
D3787A842552CCA621630495 /* Pods-Runner.debug.xcconfig */,
E913EDBE59656A0E8EB14DDA /* Pods-Runner.release.xcconfig */,
7D210E37B46E2650FA945AB1 /* Pods-Runner.profile.xcconfig */,
D73569CF22DB2A16EAE0220D /* Pods-RunnerTests.debug.xcconfig */,
E7AEAE59248BEA6C8378B114 /* Pods-RunnerTests.release.xcconfig */,
E231F0C855BB3DD103DA44E9 /* Pods-RunnerTests.profile.xcconfig */,
D0CBE1B7A5C3D8E84DECC981 /* Pods-Runner.debug.xcconfig */,
FD54B3E6C9A9278793818CA8 /* Pods-Runner.release.xcconfig */,
132767BCEC59ECA2C27AAF55 /* Pods-Runner.profile.xcconfig */,
9F8B7E7E836FBA71F1E2767D /* Pods-RunnerTests.debug.xcconfig */,
18106D637ED786D29FE68004 /* Pods-RunnerTests.release.xcconfig */,
481FF39ABA9170A968D00D47 /* Pods-RunnerTests.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@@ -138,7 +129,7 @@
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
4358F1D645E2BE879D24A551 /* Pods */,
32F89EBD1A567B14B95A803E /* Frameworks */,
B0AE19443A2FC97A6908AB80 /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -166,6 +157,15 @@
path = Runner;
sourceTree = "<group>";
};
B0AE19443A2FC97A6908AB80 /* Frameworks */ = {
isa = PBXGroup;
children = (
8E85B5AB729F0B2360835644 /* Pods_Runner.framework */,
F2698D5B078302CF0E4E6EE6 /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -173,7 +173,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
802002D8FFADD5D24C50A9FA /* [CP] Check Pods Manifest.lock */,
1C96070FD74708494C91C45C /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
CE18F12EDBB0BF2FD5BF0F0E /* Frameworks */,
@@ -192,15 +192,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
3190980419AFCAD7AC11C68D /* [CP] Check Pods Manifest.lock */,
6FA29CD45882489C42CB69A1 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
DDBAC86E6B3F372170C284A0 /* [CP] Embed Pods Frameworks */,
B482CF705AC6985E445540F2 /* [CP] Copy Pods Resources */,
523FF08A9B798D86BA8B9DD9 /* Frameworks */,
24F448645ED8BCE73BE4BB9F /* [CP] Embed Pods Frameworks */,
E28A122442FA326B99260C5B /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -272,45 +272,7 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3190980419AFCAD7AC11C68D /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
802002D8FFADD5D24C50A9FA /* [CP] Check Pods Manifest.lock */ = {
1C96070FD74708494C91C45C /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -332,6 +294,61 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
24F448645ED8BCE73BE4BB9F /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
6FA29CD45882489C42CB69A1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -347,7 +364,7 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
B482CF705AC6985E445540F2 /* [CP] Copy Pods Resources */ = {
E28A122442FA326B99260C5B /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -364,23 +381,6 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
DDBAC86E6B3F372170C284A0 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -472,6 +472,7 @@
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = s;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -500,9 +501,10 @@
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 3XA29H789G;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.lifestyle";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -510,16 +512,21 @@
PRODUCT_BUNDLE_IDENTIFIER = cn.yooss.moodiary;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "moodiary-dev";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "moodiary-ios";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D73569CF22DB2A16EAE0220D /* Pods-RunnerTests.debug.xcconfig */;
baseConfigurationReference = 9F8B7E7E836FBA71F1E2767D /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Manual;
@@ -539,7 +546,7 @@
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = E7AEAE59248BEA6C8378B114 /* Pods-RunnerTests.release.xcconfig */;
baseConfigurationReference = 18106D637ED786D29FE68004 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Manual;
@@ -557,7 +564,7 @@
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = E231F0C855BB3DD103DA44E9 /* Pods-RunnerTests.profile.xcconfig */;
baseConfigurationReference = 481FF39ABA9170A968D00D47 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Manual;
@@ -671,6 +678,8 @@
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = s;
GCC_PREPROCESSOR_DEFINITIONS = "DISABLE_PUSH_NOTIFICATIONS=1";
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -680,7 +689,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
@@ -701,9 +710,10 @@
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 3XA29H789G;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = debug;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.lifestyle";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -711,10 +721,15 @@
PRODUCT_BUNDLE_IDENTIFIER = cn.yooss.moodiary;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "moodiary-dev";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "moodiary-ios";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
@@ -732,9 +747,10 @@
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 3XA29H789G;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.lifestyle";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -742,9 +758,14 @@
PRODUCT_BUNDLE_IDENTIFIER = cn.yooss.moodiary;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "moodiary-dev";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "moodiary-ios";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;

View File

@@ -51,7 +51,7 @@
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@@ -60,6 +60,7 @@
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
showGraphicsOverview = "Yes"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">

View File

@@ -20,24 +20,38 @@
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppleMusicUsageDescription</key>
<string>应用需要您的同意,才能访问媒体资料库</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>应用需要您的同意,才能使用蓝牙</string>
<key>NSCameraUsageDescription</key>
<string>使用你的摄像头拍摄媒体</string>
<string>应用需要您的同意,才能访问相机</string>
<key>NSContactsUsageDescription</key>
<string>应用需要您的同意,才能访问通讯录</string>
<key>NSFaceIDUsageDescription</key>
<string>应用需要您的同意,才能获取人脸识别权限</string>
<string>应用需要您的同意,才能使用人脸识别</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>应用需要您的同意,才能访问位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>应用需要您的同意,才能访问位置信息,以便于获取位置</string>
<string>应用需要您的同意,才能访问位置</string>
<key>NSMicrophoneUsageDescription</key>
<string>应用需要您的同意,才能使用麦克风,以便于语音录制</string>
<string>应用需要您的同意,才能使用麦克风</string>
<key>NSMotionUsageDescription</key>
<string>应用需要您的同意,才能访问运动与健身</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>访问你的媒体数据</string>
<string>应用需要您的同意,才能访问照片</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>访问你的照片</string>
<string>应用需要您的同意,才能访问照片</string>
<key>NSSiriUsageDescription</key>
<string>应用需要您的同意才能访问Siri</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>应用需要您的同意,才能访问语音识别</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
@@ -59,5 +73,7 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>keychain-access-groups</key>
<array/>
</dict>
</plist>

View File

@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
@@ -14,13 +16,14 @@
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-26" y="-77"/>
</scene>
</scenes>
</document>

View File

@@ -11,16 +11,19 @@ import 'package:moodiary/common/models/hitokoto.dart';
import 'package:moodiary/common/models/hunyuan.dart';
import 'package:moodiary/common/models/image.dart';
import 'package:moodiary/common/models/weather.dart';
import 'package:moodiary/main.dart';
import 'package:moodiary/presentation/pref.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'package:moodiary/persistence/pref.dart';
import 'package:moodiary/utils/http_util.dart';
import 'package:moodiary/utils/notice_util.dart';
import 'package:moodiary/utils/signature_util.dart';
import 'package:refreshed/refreshed.dart';
class Api {
static Future<Stream<String>?> getHunYuan(
String id, String key, List<Message> messages, int model) async {
String id,
String key,
List<Message> messages,
int model,
) async {
//获取时间戳
final timestamp = DateTime.now().millisecondsSinceEpoch;
final hunyuanModel = switch (model) {
@@ -33,64 +36,80 @@ class Api {
//请求正文
final body = {
'Model': hunyuanModel,
'Messages': messages.map((value) => value.toMap()).toList(),
'Messages': messages.map((value) => value.toJson()).toList(),
'Stream': true,
};
//获取签名
final authorization =
SignatureUtil.generateSignature(id, key, timestamp, body);
final authorization = SignatureUtil.generateSignature(
id,
key,
timestamp,
body,
);
//构造请求头
final header = PublicHeader(
'ChatCompletions', timestamp ~/ 1000, '2023-09-01', authorization);
action: 'ChatCompletions',
timestamp: timestamp ~/ 1000,
version: '2023-09-01',
authorization: authorization,
);
//发起请求
return await HttpUtil().postStream('https://hunyuan.tencentcloudapi.com',
header: header.toMap(), data: body);
return await HttpUtil().postStream(
'https://hunyuan.tencentcloudapi.com',
header: header.toJson(),
data: body,
);
}
static Future<Uint8List?> getImageData(String url) async {
return (await HttpUtil().get(url, type: ResponseType.bytes)).data;
}
static Future<List<String>?> updatePosition() async {
static Future<List<String>?> updatePosition(BuildContext context) async {
Position? position;
var permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
NoticeUtil.showToast(l10n.noticeEnableLocation);
if (permission == LocationPermission.denied && context.mounted) {
toast.info(message: context.l10n.noticeEnableLocation);
return null;
}
if (permission == LocationPermission.deniedForever) {
NoticeUtil.showToast(l10n.noticeEnableLocation2);
if (permission == LocationPermission.deniedForever && context.mounted) {
toast.info(message: context.l10n.noticeEnableLocation2);
return null;
}
}
if (await Geolocator.isLocationServiceEnabled()) {
position = await Geolocator.getLastKnownPosition(
forceAndroidLocationManager: true);
forceAndroidLocationManager: true,
);
position ??= await Geolocator.getCurrentPosition(
locationSettings: AndroidSettings(forceLocationManager: true));
locationSettings: AndroidSettings(forceLocationManager: true),
);
}
if (position != null) {
final local = Localizations.localeOf(Get.context!);
if (position != null && context.mounted) {
final local = Localizations.localeOf(context);
final parameters = {
'location':
'${double.parse(position.longitude.toStringAsFixed(2))},${double.parse(position.latitude.toStringAsFixed(2))}',
'key': PrefUtil.getValue<String>('qweatherKey'),
'lang': local
'lang': local,
};
final res = await HttpUtil().get(
'https://geoapi.qweather.com/v2/city/lookup',
parameters: parameters);
final geo =
await compute(GeoResponse.fromJson, res.data as Map<String, dynamic>);
'https://${PrefUtil.getValue<String>('qweatherApiHost')}/geo/v2/city/lookup',
parameters: parameters,
);
final geo = await compute(
GeoResponse.fromJson,
res.data as Map<String, dynamic>,
);
if (geo.location != null && geo.location!.isNotEmpty) {
final city = geo.location!.first;
return [
position.latitude.toString(),
position.longitude.toString(),
'${city.adm2} ${city.name}'
'${city.adm2} ${city.name}',
];
} else {
return null;
@@ -100,36 +119,41 @@ class Api {
}
}
static Future<List<String>?> updateWeather({required LatLng position}) async {
final local = Localizations.localeOf(Get.context!);
static Future<List<String>?> updateWeather({
required BuildContext context,
required LatLng position,
}) async {
final local = Localizations.localeOf(context);
final parameters = {
'location':
'${double.parse(position.longitude.toStringAsFixed(2))},${double.parse(position.latitude.toStringAsFixed(2))}',
'key': PrefUtil.getValue<String>('qweatherKey'),
'lang': local
'lang': local,
};
final res = await HttpUtil().get(
'https://devapi.qweather.com/v7/weather/now',
parameters: parameters);
'https://${PrefUtil.getValue<String>('qweatherApiHost')}/v7/weather/now',
parameters: parameters,
);
final weather = await compute(
WeatherResponse.fromJson, res.data as Map<String, dynamic>);
WeatherResponse.fromJson,
res.data as Map<String, dynamic>,
);
if (weather.now != null) {
return [
weather.now!.icon!,
weather.now!.temp!,
weather.now!.text!,
];
return [weather.now!.icon!, weather.now!.temp!, weather.now!.text!];
} else {
return null;
}
}
static Future<GithubRelease?> getGithubRelease() async {
final res = await HttpUtil()
.get('https://api.github.com/repos/ZhuJHua/moodiary/releases/latest');
final res = await HttpUtil().get(
'https://api.github.com/repos/ZhuJHua/moodiary/releases/latest',
);
if (res.data != null) {
final githubRelease = await compute(
GithubRelease.fromJson, res.data as Map<String, dynamic>);
GithubRelease.fromJson,
res.data as Map<String, dynamic>,
);
return githubRelease;
}
return null;
@@ -138,15 +162,20 @@ class Api {
static Future<List<String>?> updateHitokoto() async {
final res = await HttpUtil().get('https://v1.hitokoto.cn');
final hitokoto = await compute(
HitokotoResponse.fromJson, res.data as Map<String, dynamic>);
HitokotoResponse.fromJson,
res.data as Map<String, dynamic>,
);
return [hitokoto.hitokoto!];
}
static Future<List<String>?> updateImageUrl() async {
final res = await HttpUtil()
.get('https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1');
final BingImage bingImage =
await compute(BingImage.fromJson, res.data as Map<String, dynamic>);
final res = await HttpUtil().get(
'https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1',
);
final BingImage bingImage = await compute(
BingImage.fromJson,
res.data as Map<String, dynamic>,
);
return ['https://cn.bing.com${bingImage.images?[0].url}'];
}
}

View File

@@ -1,110 +1,45 @@
class GeoResponse {
String? code;
List<Location>? location;
Refer? refer;
import 'package:freezed_annotation/freezed_annotation.dart';
GeoResponse({this.code, this.location, this.refer});
part 'geo.freezed.dart';
part 'geo.g.dart';
GeoResponse.fromJson(Map<String, dynamic> json) {
code = json["code"];
location = json["location"] == null
? null
: (json["location"] as List).map((e) => Location.fromJson(e)).toList();
refer = json["refer"] == null ? null : Refer.fromJson(json["refer"]);
}
@freezed
abstract class GeoResponse with _$GeoResponse {
const factory GeoResponse({
String? code,
List<Location>? location,
Refer? refer,
}) = _GeoResponse;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["code"] = code;
data["location"] = location?.map((e) => e.toJson()).toList();
data["refer"] = refer?.toJson();
return data;
}
factory GeoResponse.fromJson(Map<String, dynamic> json) =>
_$GeoResponseFromJson(json);
}
class Refer {
List<String>? sources;
List<String>? license;
@freezed
abstract class Refer with _$Refer {
const factory Refer({List<String>? sources, List<String>? license}) = _Refer;
Refer({this.sources, this.license});
Refer.fromJson(Map<String, dynamic> json) {
sources =
json["sources"] == null ? null : List<String>.from(json["sources"]);
license =
json["license"] == null ? null : List<String>.from(json["license"]);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["sources"] = sources;
data["license"] = license;
return data;
}
factory Refer.fromJson(Map<String, dynamic> json) => _$ReferFromJson(json);
}
class Location {
String? name;
String? id;
String? lat;
String? lon;
String? adm2;
String? adm1;
String? country;
String? tz;
String? utcOffset;
String? isDst;
String? type;
String? rank;
String? fxLink;
@freezed
abstract class Location with _$Location {
const factory Location({
String? name,
String? id,
String? lat,
String? lon,
String? adm2,
String? adm1,
String? country,
String? tz,
String? utcOffset,
String? isDst,
String? type,
String? rank,
String? fxLink,
}) = _Location;
Location({
this.name,
this.id,
this.lat,
this.lon,
this.adm2,
this.adm1,
this.country,
this.tz,
this.utcOffset,
this.isDst,
this.type,
this.rank,
this.fxLink,
});
Location.fromJson(Map<String, dynamic> json) {
name = json["name"];
id = json["id"];
lat = json["lat"];
lon = json["lon"];
adm2 = json["adm2"];
adm1 = json["adm1"];
country = json["country"];
tz = json["tz"];
utcOffset = json["utcOffset"];
isDst = json["isDst"];
type = json["type"];
rank = json["rank"];
fxLink = json["fxLink"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["name"] = name;
data["id"] = id;
data["lat"] = lat;
data["lon"] = lon;
data["adm2"] = adm2;
data["adm1"] = adm1;
data["country"] = country;
data["tz"] = tz;
data["utcOffset"] = utcOffset;
data["isDst"] = isDst;
data["type"] = type;
data["rank"] = rank;
data["fxLink"] = fxLink;
return data;
}
factory Location.fromJson(Map<String, dynamic> json) =>
_$LocationFromJson(json);
}

View File

@@ -0,0 +1,768 @@
// dart format width=80
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'geo.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$GeoResponse {
String? get code;
List<Location>? get location;
Refer? get refer;
/// Create a copy of GeoResponse
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$GeoResponseCopyWith<GeoResponse> get copyWith =>
_$GeoResponseCopyWithImpl<GeoResponse>(this as GeoResponse, _$identity);
/// Serializes this GeoResponse to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is GeoResponse &&
(identical(other.code, code) || other.code == code) &&
const DeepCollectionEquality().equals(other.location, location) &&
(identical(other.refer, refer) || other.refer == refer));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, code, const DeepCollectionEquality().hash(location), refer);
@override
String toString() {
return 'GeoResponse(code: $code, location: $location, refer: $refer)';
}
}
/// @nodoc
abstract mixin class $GeoResponseCopyWith<$Res> {
factory $GeoResponseCopyWith(GeoResponse value,
$Res Function(GeoResponse) _then) = _$GeoResponseCopyWithImpl;
@useResult
$Res call({
String? code, List<Location>? location, Refer? refer
});
$ReferCopyWith<$Res>? get refer;
}
/// @nodoc
class _$GeoResponseCopyWithImpl<$Res>
implements $GeoResponseCopyWith<$Res> {
_$GeoResponseCopyWithImpl(this._self, this._then);
final GeoResponse _self;
final $Res Function(GeoResponse) _then;
/// Create a copy of GeoResponse
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? code = freezed, Object? location = freezed, Object? refer = freezed,}) {
return _then(_self.copyWith(
code: freezed == code
? _self.code
: code // ignore: cast_nullable_to_non_nullable
as String?,
location: freezed == location
? _self.location
: location // ignore: cast_nullable_to_non_nullable
as List<Location>?,
refer: freezed == refer
? _self.refer
: refer // ignore: cast_nullable_to_non_nullable
as Refer?,
));
}
/// Create a copy of GeoResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$ReferCopyWith<$Res>? get refer {
if (_self.refer == null) {
return null;
}
return $ReferCopyWith<$Res>(_self.refer!, (value) {
return _then(_self.copyWith(refer: value));
});
}
}
/// @nodoc
@JsonSerializable()
class _GeoResponse implements GeoResponse {
const _GeoResponse({this.code, final List<Location>? location, this.refer})
: _location = location;
factory _GeoResponse.fromJson(Map<String, dynamic> json) =>
_$GeoResponseFromJson(json);
@override final String? code;
final List<Location>? _location;
@override List<Location>? get location {
final value = _location;
if (value == null) return null;
if (_location is EqualUnmodifiableListView) return _location;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override final Refer? refer;
/// Create a copy of GeoResponse
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$GeoResponseCopyWith<_GeoResponse> get copyWith =>
__$GeoResponseCopyWithImpl<_GeoResponse>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$GeoResponseToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _GeoResponse &&
(identical(other.code, code) || other.code == code) &&
const DeepCollectionEquality().equals(other._location, _location) &&
(identical(other.refer, refer) || other.refer == refer));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, code, const DeepCollectionEquality().hash(_location), refer);
@override
String toString() {
return 'GeoResponse(code: $code, location: $location, refer: $refer)';
}
}
/// @nodoc
abstract mixin class _$GeoResponseCopyWith<$Res>
implements $GeoResponseCopyWith<$Res> {
factory _$GeoResponseCopyWith(_GeoResponse value,
$Res Function(_GeoResponse) _then) = __$GeoResponseCopyWithImpl;
@override
@useResult
$Res call({
String? code, List<Location>? location, Refer? refer
});
@override $ReferCopyWith<$Res>? get refer;
}
/// @nodoc
class __$GeoResponseCopyWithImpl<$Res>
implements _$GeoResponseCopyWith<$Res> {
__$GeoResponseCopyWithImpl(this._self, this._then);
final _GeoResponse _self;
final $Res Function(_GeoResponse) _then;
/// Create a copy of GeoResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? code = freezed, Object? location = freezed, Object? refer = freezed,}) {
return _then(_GeoResponse(
code: freezed == code
? _self.code
: code // ignore: cast_nullable_to_non_nullable
as String?,
location: freezed == location
? _self._location
: location // ignore: cast_nullable_to_non_nullable
as List<Location>?,
refer: freezed == refer
? _self.refer
: refer // ignore: cast_nullable_to_non_nullable
as Refer?,
));
}
/// Create a copy of GeoResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$ReferCopyWith<$Res>? get refer {
if (_self.refer == null) {
return null;
}
return $ReferCopyWith<$Res>(_self.refer!, (value) {
return _then(_self.copyWith(refer: value));
});
}
}
/// @nodoc
mixin _$Refer {
List<String>? get sources;
List<String>? get license;
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$ReferCopyWith<Refer> get copyWith =>
_$ReferCopyWithImpl<Refer>(this as Refer, _$identity);
/// Serializes this Refer to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Refer &&
const DeepCollectionEquality().equals(other.sources, sources) &&
const DeepCollectionEquality().equals(other.license, license));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, const DeepCollectionEquality().hash(sources),
const DeepCollectionEquality().hash(license));
@override
String toString() {
return 'Refer(sources: $sources, license: $license)';
}
}
/// @nodoc
abstract mixin class $ReferCopyWith<$Res> {
factory $ReferCopyWith(Refer value,
$Res Function(Refer) _then) = _$ReferCopyWithImpl;
@useResult
$Res call({
List<String>? sources, List<String>? license
});
}
/// @nodoc
class _$ReferCopyWithImpl<$Res>
implements $ReferCopyWith<$Res> {
_$ReferCopyWithImpl(this._self, this._then);
final Refer _self;
final $Res Function(Refer) _then;
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? sources = freezed, Object? license = freezed,}) {
return _then(_self.copyWith(
sources: freezed == sources
? _self.sources
: sources // ignore: cast_nullable_to_non_nullable
as List<String>?,
license: freezed == license
? _self.license
: license // ignore: cast_nullable_to_non_nullable
as List<String>?,
));
}
}
/// @nodoc
@JsonSerializable()
class _Refer implements Refer {
const _Refer({final List<String>? sources, final List<String>? license})
: _sources = sources,
_license = license;
factory _Refer.fromJson(Map<String, dynamic> json) => _$ReferFromJson(json);
final List<String>? _sources;
@override List<String>? get sources {
final value = _sources;
if (value == null) return null;
if (_sources is EqualUnmodifiableListView) return _sources;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
final List<String>? _license;
@override List<String>? get license {
final value = _license;
if (value == null) return null;
if (_license is EqualUnmodifiableListView) return _license;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$ReferCopyWith<_Refer> get copyWith =>
__$ReferCopyWithImpl<_Refer>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$ReferToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _Refer &&
const DeepCollectionEquality().equals(other._sources, _sources) &&
const DeepCollectionEquality().equals(other._license, _license));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, const DeepCollectionEquality().hash(_sources),
const DeepCollectionEquality().hash(_license));
@override
String toString() {
return 'Refer(sources: $sources, license: $license)';
}
}
/// @nodoc
abstract mixin class _$ReferCopyWith<$Res> implements $ReferCopyWith<$Res> {
factory _$ReferCopyWith(_Refer value,
$Res Function(_Refer) _then) = __$ReferCopyWithImpl;
@override
@useResult
$Res call({
List<String>? sources, List<String>? license
});
}
/// @nodoc
class __$ReferCopyWithImpl<$Res>
implements _$ReferCopyWith<$Res> {
__$ReferCopyWithImpl(this._self, this._then);
final _Refer _self;
final $Res Function(_Refer) _then;
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call({Object? sources = freezed, Object? license = freezed,}) {
return _then(_Refer(
sources: freezed == sources
? _self._sources
: sources // ignore: cast_nullable_to_non_nullable
as List<String>?,
license: freezed == license
? _self._license
: license // ignore: cast_nullable_to_non_nullable
as List<String>?,
));
}
}
/// @nodoc
mixin _$Location {
String? get name;
String? get id;
String? get lat;
String? get lon;
String? get adm2;
String? get adm1;
String? get country;
String? get tz;
String? get utcOffset;
String? get isDst;
String? get type;
String? get rank;
String? get fxLink;
/// Create a copy of Location
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$LocationCopyWith<Location> get copyWith =>
_$LocationCopyWithImpl<Location>(this as Location, _$identity);
/// Serializes this Location to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Location &&
(identical(other.name, name) || other.name == name) &&
(identical(other.id, id) || other.id == id) &&
(identical(other.lat, lat) || other.lat == lat) &&
(identical(other.lon, lon) || other.lon == lon) &&
(identical(other.adm2, adm2) || other.adm2 == adm2) &&
(identical(other.adm1, adm1) || other.adm1 == adm1) &&
(identical(other.country, country) || other.country == country) &&
(identical(other.tz, tz) || other.tz == tz) &&
(identical(other.utcOffset, utcOffset) ||
other.utcOffset == utcOffset) &&
(identical(other.isDst, isDst) || other.isDst == isDst) &&
(identical(other.type, type) || other.type == type) &&
(identical(other.rank, rank) || other.rank == rank) &&
(identical(other.fxLink, fxLink) || other.fxLink == fxLink));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
name,
id,
lat,
lon,
adm2,
adm1,
country,
tz,
utcOffset,
isDst,
type,
rank,
fxLink);
@override
String toString() {
return 'Location(name: $name, id: $id, lat: $lat, lon: $lon, adm2: $adm2, adm1: $adm1, country: $country, tz: $tz, utcOffset: $utcOffset, isDst: $isDst, type: $type, rank: $rank, fxLink: $fxLink)';
}
}
/// @nodoc
abstract mixin class $LocationCopyWith<$Res> {
factory $LocationCopyWith(Location value,
$Res Function(Location) _then) = _$LocationCopyWithImpl;
@useResult
$Res call({
String? name, String? id, String? lat, String? lon, String? adm2, String? adm1, String? country, String? tz, String? utcOffset, String? isDst, String? type, String? rank, String? fxLink
});
}
/// @nodoc
class _$LocationCopyWithImpl<$Res>
implements $LocationCopyWith<$Res> {
_$LocationCopyWithImpl(this._self, this._then);
final Location _self;
final $Res Function(Location) _then;
/// Create a copy of Location
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? name = freezed, Object? id = freezed, Object? lat = freezed, Object? lon = freezed, Object? adm2 = freezed, Object? adm1 = freezed, Object? country = freezed, Object? tz = freezed, Object? utcOffset = freezed, Object? isDst = freezed, Object? type = freezed, Object? rank = freezed, Object? fxLink = freezed,}) {
return _then(_self.copyWith(
name: freezed == name
? _self.name
: name // ignore: cast_nullable_to_non_nullable
as String?,
id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
as String?,
lat: freezed == lat
? _self.lat
: lat // ignore: cast_nullable_to_non_nullable
as String?,
lon: freezed == lon
? _self.lon
: lon // ignore: cast_nullable_to_non_nullable
as String?,
adm2: freezed == adm2
? _self.adm2
: adm2 // ignore: cast_nullable_to_non_nullable
as String?,
adm1: freezed == adm1
? _self.adm1
: adm1 // ignore: cast_nullable_to_non_nullable
as String?,
country: freezed == country
? _self.country
: country // ignore: cast_nullable_to_non_nullable
as String?,
tz: freezed == tz ? _self.tz : tz // ignore: cast_nullable_to_non_nullable
as String?,
utcOffset: freezed == utcOffset
? _self.utcOffset
: utcOffset // ignore: cast_nullable_to_non_nullable
as String?,
isDst: freezed == isDst
? _self.isDst
: isDst // ignore: cast_nullable_to_non_nullable
as String?,
type: freezed == type
? _self.type
: type // ignore: cast_nullable_to_non_nullable
as String?,
rank: freezed == rank
? _self.rank
: rank // ignore: cast_nullable_to_non_nullable
as String?,
fxLink: freezed == fxLink
? _self.fxLink
: fxLink // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
/// @nodoc
@JsonSerializable()
class _Location implements Location {
const _Location(
{this.name, this.id, this.lat, this.lon, this.adm2, this.adm1, this.country, this.tz, this.utcOffset, this.isDst, this.type, this.rank, this.fxLink});
factory _Location.fromJson(Map<String, dynamic> json) =>
_$LocationFromJson(json);
@override final String? name;
@override final String? id;
@override final String? lat;
@override final String? lon;
@override final String? adm2;
@override final String? adm1;
@override final String? country;
@override final String? tz;
@override final String? utcOffset;
@override final String? isDst;
@override final String? type;
@override final String? rank;
@override final String? fxLink;
/// Create a copy of Location
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$LocationCopyWith<_Location> get copyWith =>
__$LocationCopyWithImpl<_Location>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$LocationToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _Location &&
(identical(other.name, name) || other.name == name) &&
(identical(other.id, id) || other.id == id) &&
(identical(other.lat, lat) || other.lat == lat) &&
(identical(other.lon, lon) || other.lon == lon) &&
(identical(other.adm2, adm2) || other.adm2 == adm2) &&
(identical(other.adm1, adm1) || other.adm1 == adm1) &&
(identical(other.country, country) || other.country == country) &&
(identical(other.tz, tz) || other.tz == tz) &&
(identical(other.utcOffset, utcOffset) ||
other.utcOffset == utcOffset) &&
(identical(other.isDst, isDst) || other.isDst == isDst) &&
(identical(other.type, type) || other.type == type) &&
(identical(other.rank, rank) || other.rank == rank) &&
(identical(other.fxLink, fxLink) || other.fxLink == fxLink));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
name,
id,
lat,
lon,
adm2,
adm1,
country,
tz,
utcOffset,
isDst,
type,
rank,
fxLink);
@override
String toString() {
return 'Location(name: $name, id: $id, lat: $lat, lon: $lon, adm2: $adm2, adm1: $adm1, country: $country, tz: $tz, utcOffset: $utcOffset, isDst: $isDst, type: $type, rank: $rank, fxLink: $fxLink)';
}
}
/// @nodoc
abstract mixin class _$LocationCopyWith<$Res>
implements $LocationCopyWith<$Res> {
factory _$LocationCopyWith(_Location value,
$Res Function(_Location) _then) = __$LocationCopyWithImpl;
@override
@useResult
$Res call({
String? name, String? id, String? lat, String? lon, String? adm2, String? adm1, String? country, String? tz, String? utcOffset, String? isDst, String? type, String? rank, String? fxLink
});
}
/// @nodoc
class __$LocationCopyWithImpl<$Res>
implements _$LocationCopyWith<$Res> {
__$LocationCopyWithImpl(this._self, this._then);
final _Location _self;
final $Res Function(_Location) _then;
/// Create a copy of Location
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? name = freezed, Object? id = freezed, Object? lat = freezed, Object? lon = freezed, Object? adm2 = freezed, Object? adm1 = freezed, Object? country = freezed, Object? tz = freezed, Object? utcOffset = freezed, Object? isDst = freezed, Object? type = freezed, Object? rank = freezed, Object? fxLink = freezed,}) {
return _then(_Location(
name: freezed == name
? _self.name
: name // ignore: cast_nullable_to_non_nullable
as String?,
id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
as String?,
lat: freezed == lat
? _self.lat
: lat // ignore: cast_nullable_to_non_nullable
as String?,
lon: freezed == lon
? _self.lon
: lon // ignore: cast_nullable_to_non_nullable
as String?,
adm2: freezed == adm2
? _self.adm2
: adm2 // ignore: cast_nullable_to_non_nullable
as String?,
adm1: freezed == adm1
? _self.adm1
: adm1 // ignore: cast_nullable_to_non_nullable
as String?,
country: freezed == country
? _self.country
: country // ignore: cast_nullable_to_non_nullable
as String?,
tz: freezed == tz ? _self.tz : tz // ignore: cast_nullable_to_non_nullable
as String?,
utcOffset: freezed == utcOffset
? _self.utcOffset
: utcOffset // ignore: cast_nullable_to_non_nullable
as String?,
isDst: freezed == isDst
? _self.isDst
: isDst // ignore: cast_nullable_to_non_nullable
as String?,
type: freezed == type
? _self.type
: type // ignore: cast_nullable_to_non_nullable
as String?,
rank: freezed == rank
? _self.rank
: rank // ignore: cast_nullable_to_non_nullable
as String?,
fxLink: freezed == fxLink
? _self.fxLink
: fxLink // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
// dart format on

View File

@@ -0,0 +1,70 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'geo.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_GeoResponse _$GeoResponseFromJson(Map<String, dynamic> json) => _GeoResponse(
code: json['code'] as String?,
location:
(json['location'] as List<dynamic>?)
?.map((e) => Location.fromJson(e as Map<String, dynamic>))
.toList(),
refer:
json['refer'] == null
? null
: Refer.fromJson(json['refer'] as Map<String, dynamic>),
);
Map<String, dynamic> _$GeoResponseToJson(_GeoResponse instance) =>
<String, dynamic>{
if (instance.code case final value?) 'code': value,
if (instance.location case final value?) 'location': value,
if (instance.refer case final value?) 'refer': value,
};
_Refer _$ReferFromJson(Map<String, dynamic> json) => _Refer(
sources:
(json['sources'] as List<dynamic>?)?.map((e) => e as String).toList(),
license:
(json['license'] as List<dynamic>?)?.map((e) => e as String).toList(),
);
Map<String, dynamic> _$ReferToJson(_Refer instance) => <String, dynamic>{
if (instance.sources case final value?) 'sources': value,
if (instance.license case final value?) 'license': value,
};
_Location _$LocationFromJson(Map<String, dynamic> json) => _Location(
name: json['name'] as String?,
id: json['id'] as String?,
lat: json['lat'] as String?,
lon: json['lon'] as String?,
adm2: json['adm2'] as String?,
adm1: json['adm1'] as String?,
country: json['country'] as String?,
tz: json['tz'] as String?,
utcOffset: json['utcOffset'] as String?,
isDst: json['isDst'] as String?,
type: json['type'] as String?,
rank: json['rank'] as String?,
fxLink: json['fxLink'] as String?,
);
Map<String, dynamic> _$LocationToJson(_Location instance) => <String, dynamic>{
if (instance.name case final value?) 'name': value,
if (instance.id case final value?) 'id': value,
if (instance.lat case final value?) 'lat': value,
if (instance.lon case final value?) 'lon': value,
if (instance.adm2 case final value?) 'adm2': value,
if (instance.adm1 case final value?) 'adm1': value,
if (instance.country case final value?) 'country': value,
if (instance.tz case final value?) 'tz': value,
if (instance.utcOffset case final value?) 'utcOffset': value,
if (instance.isDst case final value?) 'isDst': value,
if (instance.type case final value?) 'type': value,
if (instance.rank case final value?) 'rank': value,
if (instance.fxLink case final value?) 'fxLink': value,
};

View File

@@ -1,336 +1,107 @@
class GithubRelease {
String? url;
String? assetsUrl;
String? uploadUrl;
String? htmlUrl;
int? id;
Author? author;
String? nodeId;
String? tagName;
String? targetCommitish;
String? name;
bool? draft;
bool? prerelease;
String? createdAt;
String? publishedAt;
List<Assets>? assets;
String? tarballUrl;
String? zipballUrl;
String? body;
import 'package:freezed_annotation/freezed_annotation.dart';
GithubRelease(
{this.url,
this.assetsUrl,
this.uploadUrl,
this.htmlUrl,
this.id,
this.author,
this.nodeId,
this.tagName,
this.targetCommitish,
this.name,
this.draft,
this.prerelease,
this.createdAt,
this.publishedAt,
this.assets,
this.tarballUrl,
this.zipballUrl,
this.body});
part 'github.freezed.dart';
part 'github.g.dart';
GithubRelease.fromJson(Map<String, dynamic> json) {
url = json["url"];
assetsUrl = json["assets_url"];
uploadUrl = json["upload_url"];
htmlUrl = json["html_url"];
id = json["id"];
author = json["author"] == null ? null : Author.fromJson(json["author"]);
nodeId = json["node_id"];
tagName = json["tag_name"];
targetCommitish = json["target_commitish"];
name = json["name"];
draft = json["draft"];
prerelease = json["prerelease"];
createdAt = json["created_at"];
publishedAt = json["published_at"];
assets = json["assets"] == null
? null
: (json["assets"] as List).map((e) => Assets.fromJson(e)).toList();
tarballUrl = json["tarball_url"];
zipballUrl = json["zipball_url"];
body = json["body"];
}
@freezed
abstract class GithubRelease with _$GithubRelease {
const factory GithubRelease({
String? url,
@JsonKey(name: 'assets_url') String? assetsUrl,
@JsonKey(name: 'upload_url') String? uploadUrl,
@JsonKey(name: 'html_url') String? htmlUrl,
int? id,
Author? author,
@JsonKey(name: 'node_id') String? nodeId,
@JsonKey(name: 'tag_name') String? tagName,
@JsonKey(name: 'target_commitish') String? targetCommitish,
String? name,
bool? draft,
bool? prerelease,
@JsonKey(name: 'created_at') String? createdAt,
@JsonKey(name: 'published_at') String? publishedAt,
List<Assets>? assets,
@JsonKey(name: 'tarball_url') String? tarballUrl,
@JsonKey(name: 'zipball_url') String? zipballUrl,
String? body,
}) = _GithubRelease;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["url"] = url;
data["assets_url"] = assetsUrl;
data["upload_url"] = uploadUrl;
data["html_url"] = htmlUrl;
data["id"] = id;
if (author != null) {
data["author"] = author?.toJson();
}
data["node_id"] = nodeId;
data["tag_name"] = tagName;
data["target_commitish"] = targetCommitish;
data["name"] = name;
data["draft"] = draft;
data["prerelease"] = prerelease;
data["created_at"] = createdAt;
data["published_at"] = publishedAt;
if (assets != null) {
data["assets"] = assets?.map((e) => e.toJson()).toList();
}
data["tarball_url"] = tarballUrl;
data["zipball_url"] = zipballUrl;
data["body"] = body;
return data;
}
factory GithubRelease.fromJson(Map<String, dynamic> json) =>
_$GithubReleaseFromJson(json);
}
class Assets {
String? url;
int? id;
String? nodeId;
String? name;
dynamic label;
Uploader? uploader;
String? contentType;
String? state;
int? size;
int? downloadCount;
String? createdAt;
String? updatedAt;
String? browserDownloadUrl;
@freezed
abstract class Assets with _$Assets {
const factory Assets({
String? url,
int? id,
@JsonKey(name: 'node_id') String? nodeId,
String? name,
dynamic label,
Uploader? uploader,
@JsonKey(name: 'content_type') String? contentType,
String? state,
int? size,
@JsonKey(name: 'download_count') int? downloadCount,
@JsonKey(name: 'created_at') String? createdAt,
@JsonKey(name: 'updated_at') String? updatedAt,
@JsonKey(name: 'browser_download_url') String? browserDownloadUrl,
}) = _Assets;
Assets(
{this.url,
this.id,
this.nodeId,
this.name,
this.label,
this.uploader,
this.contentType,
this.state,
this.size,
this.downloadCount,
this.createdAt,
this.updatedAt,
this.browserDownloadUrl});
Assets.fromJson(Map<String, dynamic> json) {
url = json["url"];
id = json["id"];
nodeId = json["node_id"];
name = json["name"];
label = json["label"];
uploader =
json["uploader"] == null ? null : Uploader.fromJson(json["uploader"]);
contentType = json["content_type"];
state = json["state"];
size = json["size"];
downloadCount = json["download_count"];
createdAt = json["created_at"];
updatedAt = json["updated_at"];
browserDownloadUrl = json["browser_download_url"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["url"] = url;
data["id"] = id;
data["node_id"] = nodeId;
data["name"] = name;
data["label"] = label;
if (uploader != null) {
data["uploader"] = uploader?.toJson();
}
data["content_type"] = contentType;
data["state"] = state;
data["size"] = size;
data["download_count"] = downloadCount;
data["created_at"] = createdAt;
data["updated_at"] = updatedAt;
data["browser_download_url"] = browserDownloadUrl;
return data;
}
factory Assets.fromJson(Map<String, dynamic> json) => _$AssetsFromJson(json);
}
class Uploader {
String? login;
int? id;
String? nodeId;
String? avatarUrl;
String? gravatarId;
String? url;
String? htmlUrl;
String? followersUrl;
String? followingUrl;
String? gistsUrl;
String? starredUrl;
String? subscriptionsUrl;
String? organizationsUrl;
String? reposUrl;
String? eventsUrl;
String? receivedEventsUrl;
String? type;
String? userViewType;
bool? siteAdmin;
@freezed
abstract class Uploader with _$Uploader {
const factory Uploader({
String? login,
int? id,
@JsonKey(name: 'node_id') String? nodeId,
@JsonKey(name: 'avatar_url') String? avatarUrl,
@JsonKey(name: 'gravatar_id') String? gravatarId,
String? url,
@JsonKey(name: 'html_url') String? htmlUrl,
@JsonKey(name: 'followers_url') String? followersUrl,
@JsonKey(name: 'following_url') String? followingUrl,
@JsonKey(name: 'gists_url') String? gistsUrl,
@JsonKey(name: 'starred_url') String? starredUrl,
@JsonKey(name: 'subscriptions_url') String? subscriptionsUrl,
@JsonKey(name: 'organizations_url') String? organizationsUrl,
@JsonKey(name: 'repos_url') String? reposUrl,
@JsonKey(name: 'events_url') String? eventsUrl,
@JsonKey(name: 'received_events_url') String? receivedEventsUrl,
String? type,
@JsonKey(name: 'user_view_type') String? userViewType,
@JsonKey(name: 'site_admin') bool? siteAdmin,
}) = _Uploader;
Uploader(
{this.login,
this.id,
this.nodeId,
this.avatarUrl,
this.gravatarId,
this.url,
this.htmlUrl,
this.followersUrl,
this.followingUrl,
this.gistsUrl,
this.starredUrl,
this.subscriptionsUrl,
this.organizationsUrl,
this.reposUrl,
this.eventsUrl,
this.receivedEventsUrl,
this.type,
this.userViewType,
this.siteAdmin});
Uploader.fromJson(Map<String, dynamic> json) {
login = json["login"];
id = json["id"];
nodeId = json["node_id"];
avatarUrl = json["avatar_url"];
gravatarId = json["gravatar_id"];
url = json["url"];
htmlUrl = json["html_url"];
followersUrl = json["followers_url"];
followingUrl = json["following_url"];
gistsUrl = json["gists_url"];
starredUrl = json["starred_url"];
subscriptionsUrl = json["subscriptions_url"];
organizationsUrl = json["organizations_url"];
reposUrl = json["repos_url"];
eventsUrl = json["events_url"];
receivedEventsUrl = json["received_events_url"];
type = json["type"];
userViewType = json["user_view_type"];
siteAdmin = json["site_admin"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["login"] = login;
data["id"] = id;
data["node_id"] = nodeId;
data["avatar_url"] = avatarUrl;
data["gravatar_id"] = gravatarId;
data["url"] = url;
data["html_url"] = htmlUrl;
data["followers_url"] = followersUrl;
data["following_url"] = followingUrl;
data["gists_url"] = gistsUrl;
data["starred_url"] = starredUrl;
data["subscriptions_url"] = subscriptionsUrl;
data["organizations_url"] = organizationsUrl;
data["repos_url"] = reposUrl;
data["events_url"] = eventsUrl;
data["received_events_url"] = receivedEventsUrl;
data["type"] = type;
data["user_view_type"] = userViewType;
data["site_admin"] = siteAdmin;
return data;
}
factory Uploader.fromJson(Map<String, dynamic> json) =>
_$UploaderFromJson(json);
}
class Author {
String? login;
int? id;
String? nodeId;
String? avatarUrl;
String? gravatarId;
String? url;
String? htmlUrl;
String? followersUrl;
String? followingUrl;
String? gistsUrl;
String? starredUrl;
String? subscriptionsUrl;
String? organizationsUrl;
String? reposUrl;
String? eventsUrl;
String? receivedEventsUrl;
String? type;
String? userViewType;
bool? siteAdmin;
@freezed
abstract class Author with _$Author {
const factory Author({
String? login,
int? id,
@JsonKey(name: 'node_id') String? nodeId,
@JsonKey(name: 'avatar_url') String? avatarUrl,
@JsonKey(name: 'gravatar_id') String? gravatarId,
String? url,
@JsonKey(name: 'html_url') String? htmlUrl,
@JsonKey(name: 'followers_url') String? followersUrl,
@JsonKey(name: 'following_url') String? followingUrl,
@JsonKey(name: 'gists_url') String? gistsUrl,
@JsonKey(name: 'starred_url') String? starredUrl,
@JsonKey(name: 'subscriptions_url') String? subscriptionsUrl,
@JsonKey(name: 'organizations_url') String? organizationsUrl,
@JsonKey(name: 'repos_url') String? reposUrl,
@JsonKey(name: 'events_url') String? eventsUrl,
@JsonKey(name: 'received_events_url') String? receivedEventsUrl,
String? type,
@JsonKey(name: 'user_view_type') String? userViewType,
@JsonKey(name: 'site_admin') bool? siteAdmin,
}) = _Author;
Author(
{this.login,
this.id,
this.nodeId,
this.avatarUrl,
this.gravatarId,
this.url,
this.htmlUrl,
this.followersUrl,
this.followingUrl,
this.gistsUrl,
this.starredUrl,
this.subscriptionsUrl,
this.organizationsUrl,
this.reposUrl,
this.eventsUrl,
this.receivedEventsUrl,
this.type,
this.userViewType,
this.siteAdmin});
Author.fromJson(Map<String, dynamic> json) {
login = json["login"];
id = json["id"];
nodeId = json["node_id"];
avatarUrl = json["avatar_url"];
gravatarId = json["gravatar_id"];
url = json["url"];
htmlUrl = json["html_url"];
followersUrl = json["followers_url"];
followingUrl = json["following_url"];
gistsUrl = json["gists_url"];
starredUrl = json["starred_url"];
subscriptionsUrl = json["subscriptions_url"];
organizationsUrl = json["organizations_url"];
reposUrl = json["repos_url"];
eventsUrl = json["events_url"];
receivedEventsUrl = json["received_events_url"];
type = json["type"];
userViewType = json["user_view_type"];
siteAdmin = json["site_admin"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["login"] = login;
data["id"] = id;
data["node_id"] = nodeId;
data["avatar_url"] = avatarUrl;
data["gravatar_id"] = gravatarId;
data["url"] = url;
data["html_url"] = htmlUrl;
data["followers_url"] = followersUrl;
data["following_url"] = followingUrl;
data["gists_url"] = gistsUrl;
data["starred_url"] = starredUrl;
data["subscriptions_url"] = subscriptionsUrl;
data["organizations_url"] = organizationsUrl;
data["repos_url"] = reposUrl;
data["events_url"] = eventsUrl;
data["received_events_url"] = receivedEventsUrl;
data["type"] = type;
data["user_view_type"] = userViewType;
data["site_admin"] = siteAdmin;
return data;
}
factory Author.fromJson(Map<String, dynamic> json) => _$AuthorFromJson(json);
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,183 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'github.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_GithubRelease _$GithubReleaseFromJson(Map<String, dynamic> json) =>
_GithubRelease(
url: json['url'] as String?,
assetsUrl: json['assets_url'] as String?,
uploadUrl: json['upload_url'] as String?,
htmlUrl: json['html_url'] as String?,
id: (json['id'] as num?)?.toInt(),
author:
json['author'] == null
? null
: Author.fromJson(json['author'] as Map<String, dynamic>),
nodeId: json['node_id'] as String?,
tagName: json['tag_name'] as String?,
targetCommitish: json['target_commitish'] as String?,
name: json['name'] as String?,
draft: json['draft'] as bool?,
prerelease: json['prerelease'] as bool?,
createdAt: json['created_at'] as String?,
publishedAt: json['published_at'] as String?,
assets:
(json['assets'] as List<dynamic>?)
?.map((e) => Assets.fromJson(e as Map<String, dynamic>))
.toList(),
tarballUrl: json['tarball_url'] as String?,
zipballUrl: json['zipball_url'] as String?,
body: json['body'] as String?,
);
Map<String, dynamic> _$GithubReleaseToJson(_GithubRelease instance) =>
<String, dynamic>{
if (instance.url case final value?) 'url': value,
if (instance.assetsUrl case final value?) 'assets_url': value,
if (instance.uploadUrl case final value?) 'upload_url': value,
if (instance.htmlUrl case final value?) 'html_url': value,
if (instance.id case final value?) 'id': value,
if (instance.author case final value?) 'author': value,
if (instance.nodeId case final value?) 'node_id': value,
if (instance.tagName case final value?) 'tag_name': value,
if (instance.targetCommitish case final value?) 'target_commitish': value,
if (instance.name case final value?) 'name': value,
if (instance.draft case final value?) 'draft': value,
if (instance.prerelease case final value?) 'prerelease': value,
if (instance.createdAt case final value?) 'created_at': value,
if (instance.publishedAt case final value?) 'published_at': value,
if (instance.assets case final value?) 'assets': value,
if (instance.tarballUrl case final value?) 'tarball_url': value,
if (instance.zipballUrl case final value?) 'zipball_url': value,
if (instance.body case final value?) 'body': value,
};
_Assets _$AssetsFromJson(Map<String, dynamic> json) => _Assets(
url: json['url'] as String?,
id: (json['id'] as num?)?.toInt(),
nodeId: json['node_id'] as String?,
name: json['name'] as String?,
label: json['label'],
uploader:
json['uploader'] == null
? null
: Uploader.fromJson(json['uploader'] as Map<String, dynamic>),
contentType: json['content_type'] as String?,
state: json['state'] as String?,
size: (json['size'] as num?)?.toInt(),
downloadCount: (json['download_count'] as num?)?.toInt(),
createdAt: json['created_at'] as String?,
updatedAt: json['updated_at'] as String?,
browserDownloadUrl: json['browser_download_url'] as String?,
);
Map<String, dynamic> _$AssetsToJson(_Assets instance) => <String, dynamic>{
if (instance.url case final value?) 'url': value,
if (instance.id case final value?) 'id': value,
if (instance.nodeId case final value?) 'node_id': value,
if (instance.name case final value?) 'name': value,
if (instance.label case final value?) 'label': value,
if (instance.uploader case final value?) 'uploader': value,
if (instance.contentType case final value?) 'content_type': value,
if (instance.state case final value?) 'state': value,
if (instance.size case final value?) 'size': value,
if (instance.downloadCount case final value?) 'download_count': value,
if (instance.createdAt case final value?) 'created_at': value,
if (instance.updatedAt case final value?) 'updated_at': value,
if (instance.browserDownloadUrl case final value?)
'browser_download_url': value,
};
_Uploader _$UploaderFromJson(Map<String, dynamic> json) => _Uploader(
login: json['login'] as String?,
id: (json['id'] as num?)?.toInt(),
nodeId: json['node_id'] as String?,
avatarUrl: json['avatar_url'] as String?,
gravatarId: json['gravatar_id'] as String?,
url: json['url'] as String?,
htmlUrl: json['html_url'] as String?,
followersUrl: json['followers_url'] as String?,
followingUrl: json['following_url'] as String?,
gistsUrl: json['gists_url'] as String?,
starredUrl: json['starred_url'] as String?,
subscriptionsUrl: json['subscriptions_url'] as String?,
organizationsUrl: json['organizations_url'] as String?,
reposUrl: json['repos_url'] as String?,
eventsUrl: json['events_url'] as String?,
receivedEventsUrl: json['received_events_url'] as String?,
type: json['type'] as String?,
userViewType: json['user_view_type'] as String?,
siteAdmin: json['site_admin'] as bool?,
);
Map<String, dynamic> _$UploaderToJson(_Uploader instance) => <String, dynamic>{
if (instance.login case final value?) 'login': value,
if (instance.id case final value?) 'id': value,
if (instance.nodeId case final value?) 'node_id': value,
if (instance.avatarUrl case final value?) 'avatar_url': value,
if (instance.gravatarId case final value?) 'gravatar_id': value,
if (instance.url case final value?) 'url': value,
if (instance.htmlUrl case final value?) 'html_url': value,
if (instance.followersUrl case final value?) 'followers_url': value,
if (instance.followingUrl case final value?) 'following_url': value,
if (instance.gistsUrl case final value?) 'gists_url': value,
if (instance.starredUrl case final value?) 'starred_url': value,
if (instance.subscriptionsUrl case final value?) 'subscriptions_url': value,
if (instance.organizationsUrl case final value?) 'organizations_url': value,
if (instance.reposUrl case final value?) 'repos_url': value,
if (instance.eventsUrl case final value?) 'events_url': value,
if (instance.receivedEventsUrl case final value?)
'received_events_url': value,
if (instance.type case final value?) 'type': value,
if (instance.userViewType case final value?) 'user_view_type': value,
if (instance.siteAdmin case final value?) 'site_admin': value,
};
_Author _$AuthorFromJson(Map<String, dynamic> json) => _Author(
login: json['login'] as String?,
id: (json['id'] as num?)?.toInt(),
nodeId: json['node_id'] as String?,
avatarUrl: json['avatar_url'] as String?,
gravatarId: json['gravatar_id'] as String?,
url: json['url'] as String?,
htmlUrl: json['html_url'] as String?,
followersUrl: json['followers_url'] as String?,
followingUrl: json['following_url'] as String?,
gistsUrl: json['gists_url'] as String?,
starredUrl: json['starred_url'] as String?,
subscriptionsUrl: json['subscriptions_url'] as String?,
organizationsUrl: json['organizations_url'] as String?,
reposUrl: json['repos_url'] as String?,
eventsUrl: json['events_url'] as String?,
receivedEventsUrl: json['received_events_url'] as String?,
type: json['type'] as String?,
userViewType: json['user_view_type'] as String?,
siteAdmin: json['site_admin'] as bool?,
);
Map<String, dynamic> _$AuthorToJson(_Author instance) => <String, dynamic>{
if (instance.login case final value?) 'login': value,
if (instance.id case final value?) 'id': value,
if (instance.nodeId case final value?) 'node_id': value,
if (instance.avatarUrl case final value?) 'avatar_url': value,
if (instance.gravatarId case final value?) 'gravatar_id': value,
if (instance.url case final value?) 'url': value,
if (instance.htmlUrl case final value?) 'html_url': value,
if (instance.followersUrl case final value?) 'followers_url': value,
if (instance.followingUrl case final value?) 'following_url': value,
if (instance.gistsUrl case final value?) 'gists_url': value,
if (instance.starredUrl case final value?) 'starred_url': value,
if (instance.subscriptionsUrl case final value?) 'subscriptions_url': value,
if (instance.organizationsUrl case final value?) 'organizations_url': value,
if (instance.reposUrl case final value?) 'repos_url': value,
if (instance.eventsUrl case final value?) 'events_url': value,
if (instance.receivedEventsUrl case final value?)
'received_events_url': value,
if (instance.type case final value?) 'type': value,
if (instance.userViewType case final value?) 'user_view_type': value,
if (instance.siteAdmin case final value?) 'site_admin': value,
};

View File

@@ -1,60 +1,25 @@
class HitokotoResponse {
int? id;
String? uuid;
String? hitokoto;
String? type;
String? from;
String? fromWho;
String? creator;
int? creatorUid;
int? reviewer;
String? commitFrom;
String? createdAt;
int? length;
import 'package:freezed_annotation/freezed_annotation.dart';
HitokotoResponse(
{this.id,
this.uuid,
this.hitokoto,
this.type,
this.from,
this.fromWho,
this.creator,
this.creatorUid,
this.reviewer,
this.commitFrom,
this.createdAt,
this.length});
part 'hitokoto.freezed.dart';
part 'hitokoto.g.dart';
HitokotoResponse.fromJson(Map<String, dynamic> json) {
id = json["id"];
uuid = json["uuid"];
hitokoto = json["hitokoto"];
type = json["type"];
from = json["from"];
fromWho = json["from_who"];
creator = json["creator"];
creatorUid = json["creator_uid"];
reviewer = json["reviewer"];
commitFrom = json["commit_from"];
createdAt = json["created_at"];
length = json["length"];
}
@freezed
abstract class HitokotoResponse with _$HitokotoResponse {
const factory HitokotoResponse({
int? id,
String? uuid,
String? hitokoto,
String? type,
String? from,
@JsonKey(name: 'from_who') String? fromWho,
String? creator,
@JsonKey(name: 'creator_uid') int? creatorUid,
int? reviewer,
@JsonKey(name: 'commit_from') String? commitFrom,
@JsonKey(name: 'created_at') String? createdAt,
int? length,
}) = _HitokotoResponse;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["id"] = id;
data["uuid"] = uuid;
data["hitokoto"] = hitokoto;
data["type"] = type;
data["from"] = from;
data["from_who"] = fromWho;
data["creator"] = creator;
data["creator_uid"] = creatorUid;
data["reviewer"] = reviewer;
data["commit_from"] = commitFrom;
data["created_at"] = createdAt;
data["length"] = length;
return data;
}
factory HitokotoResponse.fromJson(Map<String, dynamic> json) =>
_$HitokotoResponseFromJson(json);
}

View File

@@ -0,0 +1,370 @@
// dart format width=80
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'hitokoto.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$HitokotoResponse {
int? get id;
String? get uuid;
String? get hitokoto;
String? get type;
String? get from;
@JsonKey(name: 'from_who') String? get fromWho;
String? get creator;
@JsonKey(name: 'creator_uid') int? get creatorUid;
int? get reviewer;
@JsonKey(name: 'commit_from') String? get commitFrom;
@JsonKey(name: 'created_at') String? get createdAt;
int? get length;
/// Create a copy of HitokotoResponse
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$HitokotoResponseCopyWith<HitokotoResponse> get copyWith =>
_$HitokotoResponseCopyWithImpl<HitokotoResponse>(
this as HitokotoResponse, _$identity);
/// Serializes this HitokotoResponse to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is HitokotoResponse &&
(identical(other.id, id) || other.id == id) &&
(identical(other.uuid, uuid) || other.uuid == uuid) &&
(identical(other.hitokoto, hitokoto) ||
other.hitokoto == hitokoto) &&
(identical(other.type, type) || other.type == type) &&
(identical(other.from, from) || other.from == from) &&
(identical(other.fromWho, fromWho) || other.fromWho == fromWho) &&
(identical(other.creator, creator) || other.creator == creator) &&
(identical(other.creatorUid, creatorUid) ||
other.creatorUid == creatorUid) &&
(identical(other.reviewer, reviewer) ||
other.reviewer == reviewer) &&
(identical(other.commitFrom, commitFrom) ||
other.commitFrom == commitFrom) &&
(identical(other.createdAt, createdAt) ||
other.createdAt == createdAt) &&
(identical(other.length, length) || other.length == length));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
id,
uuid,
hitokoto,
type,
from,
fromWho,
creator,
creatorUid,
reviewer,
commitFrom,
createdAt,
length);
@override
String toString() {
return 'HitokotoResponse(id: $id, uuid: $uuid, hitokoto: $hitokoto, type: $type, from: $from, fromWho: $fromWho, creator: $creator, creatorUid: $creatorUid, reviewer: $reviewer, commitFrom: $commitFrom, createdAt: $createdAt, length: $length)';
}
}
/// @nodoc
abstract mixin class $HitokotoResponseCopyWith<$Res> {
factory $HitokotoResponseCopyWith(HitokotoResponse value,
$Res Function(HitokotoResponse) _then) = _$HitokotoResponseCopyWithImpl;
@useResult
$Res call({
int? id, String? uuid, String? hitokoto, String? type, String? from, @JsonKey(
name: 'from_who') String? fromWho, String? creator, @JsonKey(
name: 'creator_uid') int? creatorUid, int? reviewer, @JsonKey(
name: 'commit_from') String? commitFrom, @JsonKey(
name: 'created_at') String? createdAt, int? length
});
}
/// @nodoc
class _$HitokotoResponseCopyWithImpl<$Res>
implements $HitokotoResponseCopyWith<$Res> {
_$HitokotoResponseCopyWithImpl(this._self, this._then);
final HitokotoResponse _self;
final $Res Function(HitokotoResponse) _then;
/// Create a copy of HitokotoResponse
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? id = freezed, Object? uuid = freezed, Object? hitokoto = freezed, Object? type = freezed, Object? from = freezed, Object? fromWho = freezed, Object? creator = freezed, Object? creatorUid = freezed, Object? reviewer = freezed, Object? commitFrom = freezed, Object? createdAt = freezed, Object? length = freezed,}) {
return _then(_self.copyWith(
id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
as int?,
uuid: freezed == uuid
? _self.uuid
: uuid // ignore: cast_nullable_to_non_nullable
as String?,
hitokoto: freezed == hitokoto
? _self.hitokoto
: hitokoto // ignore: cast_nullable_to_non_nullable
as String?,
type: freezed == type
? _self.type
: type // ignore: cast_nullable_to_non_nullable
as String?,
from: freezed == from
? _self.from
: from // ignore: cast_nullable_to_non_nullable
as String?,
fromWho: freezed == fromWho
? _self.fromWho
: fromWho // ignore: cast_nullable_to_non_nullable
as String?,
creator: freezed == creator
? _self.creator
: creator // ignore: cast_nullable_to_non_nullable
as String?,
creatorUid: freezed == creatorUid
? _self.creatorUid
: creatorUid // ignore: cast_nullable_to_non_nullable
as int?,
reviewer: freezed == reviewer
? _self.reviewer
: reviewer // ignore: cast_nullable_to_non_nullable
as int?,
commitFrom: freezed == commitFrom
? _self.commitFrom
: commitFrom // ignore: cast_nullable_to_non_nullable
as String?,
createdAt: freezed == createdAt
? _self.createdAt
: createdAt // ignore: cast_nullable_to_non_nullable
as String?,
length: freezed == length
? _self.length
: length // ignore: cast_nullable_to_non_nullable
as int?,
));
}
}
/// @nodoc
@JsonSerializable()
class _HitokotoResponse implements HitokotoResponse {
const _HitokotoResponse(
{this.id, this.uuid, this.hitokoto, this.type, this.from, @JsonKey(
name: 'from_who') this.fromWho, this.creator, @JsonKey(
name: 'creator_uid') this.creatorUid, this.reviewer, @JsonKey(
name: 'commit_from') this.commitFrom, @JsonKey(
name: 'created_at') this.createdAt, this.length});
factory _HitokotoResponse.fromJson(Map<String, dynamic> json) =>
_$HitokotoResponseFromJson(json);
@override final int? id;
@override final String? uuid;
@override final String? hitokoto;
@override final String? type;
@override final String? from;
@override
@JsonKey(name: 'from_who')
final String? fromWho;
@override final String? creator;
@override
@JsonKey(name: 'creator_uid')
final int? creatorUid;
@override final int? reviewer;
@override
@JsonKey(name: 'commit_from')
final String? commitFrom;
@override
@JsonKey(name: 'created_at')
final String? createdAt;
@override final int? length;
/// Create a copy of HitokotoResponse
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$HitokotoResponseCopyWith<_HitokotoResponse> get copyWith =>
__$HitokotoResponseCopyWithImpl<_HitokotoResponse>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$HitokotoResponseToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _HitokotoResponse &&
(identical(other.id, id) || other.id == id) &&
(identical(other.uuid, uuid) || other.uuid == uuid) &&
(identical(other.hitokoto, hitokoto) ||
other.hitokoto == hitokoto) &&
(identical(other.type, type) || other.type == type) &&
(identical(other.from, from) || other.from == from) &&
(identical(other.fromWho, fromWho) || other.fromWho == fromWho) &&
(identical(other.creator, creator) || other.creator == creator) &&
(identical(other.creatorUid, creatorUid) ||
other.creatorUid == creatorUid) &&
(identical(other.reviewer, reviewer) ||
other.reviewer == reviewer) &&
(identical(other.commitFrom, commitFrom) ||
other.commitFrom == commitFrom) &&
(identical(other.createdAt, createdAt) ||
other.createdAt == createdAt) &&
(identical(other.length, length) || other.length == length));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
id,
uuid,
hitokoto,
type,
from,
fromWho,
creator,
creatorUid,
reviewer,
commitFrom,
createdAt,
length);
@override
String toString() {
return 'HitokotoResponse(id: $id, uuid: $uuid, hitokoto: $hitokoto, type: $type, from: $from, fromWho: $fromWho, creator: $creator, creatorUid: $creatorUid, reviewer: $reviewer, commitFrom: $commitFrom, createdAt: $createdAt, length: $length)';
}
}
/// @nodoc
abstract mixin class _$HitokotoResponseCopyWith<$Res>
implements $HitokotoResponseCopyWith<$Res> {
factory _$HitokotoResponseCopyWith(_HitokotoResponse value,
$Res Function(_HitokotoResponse) _then) = __$HitokotoResponseCopyWithImpl;
@override
@useResult
$Res call({
int? id, String? uuid, String? hitokoto, String? type, String? from, @JsonKey(
name: 'from_who') String? fromWho, String? creator, @JsonKey(
name: 'creator_uid') int? creatorUid, int? reviewer, @JsonKey(
name: 'commit_from') String? commitFrom, @JsonKey(
name: 'created_at') String? createdAt, int? length
});
}
/// @nodoc
class __$HitokotoResponseCopyWithImpl<$Res>
implements _$HitokotoResponseCopyWith<$Res> {
__$HitokotoResponseCopyWithImpl(this._self, this._then);
final _HitokotoResponse _self;
final $Res Function(_HitokotoResponse) _then;
/// Create a copy of HitokotoResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? id = freezed, Object? uuid = freezed, Object? hitokoto = freezed, Object? type = freezed, Object? from = freezed, Object? fromWho = freezed, Object? creator = freezed, Object? creatorUid = freezed, Object? reviewer = freezed, Object? commitFrom = freezed, Object? createdAt = freezed, Object? length = freezed,}) {
return _then(_HitokotoResponse(
id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
as int?,
uuid: freezed == uuid
? _self.uuid
: uuid // ignore: cast_nullable_to_non_nullable
as String?,
hitokoto: freezed == hitokoto
? _self.hitokoto
: hitokoto // ignore: cast_nullable_to_non_nullable
as String?,
type: freezed == type
? _self.type
: type // ignore: cast_nullable_to_non_nullable
as String?,
from: freezed == from
? _self.from
: from // ignore: cast_nullable_to_non_nullable
as String?,
fromWho: freezed == fromWho
? _self.fromWho
: fromWho // ignore: cast_nullable_to_non_nullable
as String?,
creator: freezed == creator
? _self.creator
: creator // ignore: cast_nullable_to_non_nullable
as String?,
creatorUid: freezed == creatorUid
? _self.creatorUid
: creatorUid // ignore: cast_nullable_to_non_nullable
as int?,
reviewer: freezed == reviewer
? _self.reviewer
: reviewer // ignore: cast_nullable_to_non_nullable
as int?,
commitFrom: freezed == commitFrom
? _self.commitFrom
: commitFrom // ignore: cast_nullable_to_non_nullable
as String?,
createdAt: freezed == createdAt
? _self.createdAt
: createdAt // ignore: cast_nullable_to_non_nullable
as String?,
length: freezed == length
? _self.length
: length // ignore: cast_nullable_to_non_nullable
as int?,
));
}
}
// dart format on

View File

@@ -0,0 +1,39 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'hitokoto.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_HitokotoResponse _$HitokotoResponseFromJson(Map<String, dynamic> json) =>
_HitokotoResponse(
id: (json['id'] as num?)?.toInt(),
uuid: json['uuid'] as String?,
hitokoto: json['hitokoto'] as String?,
type: json['type'] as String?,
from: json['from'] as String?,
fromWho: json['from_who'] as String?,
creator: json['creator'] as String?,
creatorUid: (json['creator_uid'] as num?)?.toInt(),
reviewer: (json['reviewer'] as num?)?.toInt(),
commitFrom: json['commit_from'] as String?,
createdAt: json['created_at'] as String?,
length: (json['length'] as num?)?.toInt(),
);
Map<String, dynamic> _$HitokotoResponseToJson(_HitokotoResponse instance) =>
<String, dynamic>{
if (instance.id case final value?) 'id': value,
if (instance.uuid case final value?) 'uuid': value,
if (instance.hitokoto case final value?) 'hitokoto': value,
if (instance.type case final value?) 'type': value,
if (instance.from case final value?) 'from': value,
if (instance.fromWho case final value?) 'from_who': value,
if (instance.creator case final value?) 'creator': value,
if (instance.creatorUid case final value?) 'creator_uid': value,
if (instance.reviewer case final value?) 'reviewer': value,
if (instance.commitFrom case final value?) 'commit_from': value,
if (instance.createdAt case final value?) 'created_at': value,
if (instance.length case final value?) 'length': value,
};

View File

@@ -1,136 +1,74 @@
class PublicHeader {
String? action;
int? timestamp;
String? version;
String? authorization;
import 'package:freezed_annotation/freezed_annotation.dart';
Map<String, dynamic> toMap() {
return {
'X-TC-Action': action,
'X-TC-Timestamp': timestamp,
'X-TC-Version': version,
'Authorization': authorization,
};
}
part 'hunyuan.freezed.dart';
part 'hunyuan.g.dart';
PublicHeader.fromMap(Map<String, dynamic> map) {
action = map['X-TC-Action'];
timestamp = map['X-TC-Timestamp'];
version = map['X-TC-Version'];
authorization = map['Authorization'];
}
@freezed
abstract class PublicHeader with _$PublicHeader {
const factory PublicHeader({
@JsonKey(name: 'X-TC-Action') String? action,
@JsonKey(name: 'X-TC-Timestamp') int? timestamp,
@JsonKey(name: 'X-TC-Version') String? version,
@JsonKey(name: 'Authorization') String? authorization,
}) = _PublicHeader;
PublicHeader(this.action, this.timestamp, this.version, this.authorization);
factory PublicHeader.fromJson(Map<String, dynamic> json) =>
_$PublicHeaderFromJson(json);
}
class Message {
late String role;
late String content;
@freezed
abstract class Message with _$Message {
const factory Message({
@JsonKey(name: 'Role') required String role,
@JsonKey(name: 'Content') required String content,
}) = _Message;
Message(this.role, this.content);
Map<String, dynamic> toMap() {
return {'Role': role, 'Content': content};
}
Message.fromMap(Map<String, dynamic> map) {
role = map['Role'];
content = map['Content'];
}
factory Message.fromJson(Map<String, dynamic> json) =>
_$MessageFromJson(json);
}
class HunyuanResponse {
String? note;
List<Choices>? choices;
int? created;
String? id;
Usage? usage;
@freezed
abstract class HunyuanResponse with _$HunyuanResponse {
const factory HunyuanResponse({
@JsonKey(name: 'Note') String? note,
@JsonKey(name: 'Choices') List<Choices>? choices,
@JsonKey(name: 'Created') int? created,
@JsonKey(name: 'Id') String? id,
@JsonKey(name: 'Usage') Usage? usage,
}) = _HunyuanResponse;
HunyuanResponse({this.note, this.choices, this.created, this.id, this.usage});
HunyuanResponse.fromJson(Map<String, dynamic> json) {
note = json["Note"];
choices = json["Choices"] == null
? null
: (json["Choices"] as List).map((e) => Choices.fromJson(e)).toList();
created = json["Created"];
id = json["Id"];
usage = json["Usage"] == null ? null : Usage.fromJson(json["Usage"]);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["Note"] = note;
if (choices != null) {
data["Choices"] = choices?.map((e) => e.toJson()).toList();
}
data["Created"] = created;
data["Id"] = id;
if (usage != null) {
data["Usage"] = usage?.toJson();
}
return data;
}
factory HunyuanResponse.fromJson(Map<String, dynamic> json) =>
_$HunyuanResponseFromJson(json);
}
class Usage {
int? promptTokens;
int? completionTokens;
int? totalTokens;
@freezed
abstract class Usage with _$Usage {
const factory Usage({
@JsonKey(name: 'PromptTokens') int? promptTokens,
@JsonKey(name: 'CompletionTokens') int? completionTokens,
@JsonKey(name: 'TotalTokens') int? totalTokens,
}) = _Usage;
Usage({this.promptTokens, this.completionTokens, this.totalTokens});
Usage.fromJson(Map<String, dynamic> json) {
promptTokens = json["PromptTokens"];
completionTokens = json["CompletionTokens"];
totalTokens = json["TotalTokens"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["PromptTokens"] = promptTokens;
data["CompletionTokens"] = completionTokens;
data["TotalTokens"] = totalTokens;
return data;
}
factory Usage.fromJson(Map<String, dynamic> json) => _$UsageFromJson(json);
}
class Choices {
String? finishReason;
Delta? delta;
@freezed
abstract class Choices with _$Choices {
const factory Choices({
@JsonKey(name: 'FinishReason') String? finishReason,
@JsonKey(name: 'Delta') Delta? delta,
}) = _Choices;
Choices({this.finishReason, this.delta});
Choices.fromJson(Map<String, dynamic> json) {
finishReason = json["FinishReason"];
delta = json["Delta"] == null ? null : Delta.fromJson(json["Delta"]);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["FinishReason"] = finishReason;
if (delta != null) {
data["Delta"] = delta?.toJson();
}
return data;
}
factory Choices.fromJson(Map<String, dynamic> json) =>
_$ChoicesFromJson(json);
}
class Delta {
String? role;
String? content;
@freezed
abstract class Delta with _$Delta {
const factory Delta({
@JsonKey(name: 'Role') String? role,
@JsonKey(name: 'Content') String? content,
}) = _Delta;
Delta({this.role, this.content});
Delta.fromJson(Map<String, dynamic> json) {
role = json["Role"];
content = json["Content"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["Role"] = role;
data["Content"] = content;
return data;
}
factory Delta.fromJson(Map<String, dynamic> json) => _$DeltaFromJson(json);
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,88 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'hunyuan.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_PublicHeader _$PublicHeaderFromJson(Map<String, dynamic> json) =>
_PublicHeader(
action: json['X-TC-Action'] as String?,
timestamp: (json['X-TC-Timestamp'] as num?)?.toInt(),
version: json['X-TC-Version'] as String?,
authorization: json['Authorization'] as String?,
);
Map<String, dynamic> _$PublicHeaderToJson(_PublicHeader instance) =>
<String, dynamic>{
if (instance.action case final value?) 'X-TC-Action': value,
if (instance.timestamp case final value?) 'X-TC-Timestamp': value,
if (instance.version case final value?) 'X-TC-Version': value,
if (instance.authorization case final value?) 'Authorization': value,
};
_Message _$MessageFromJson(Map<String, dynamic> json) =>
_Message(role: json['Role'] as String, content: json['Content'] as String);
Map<String, dynamic> _$MessageToJson(_Message instance) => <String, dynamic>{
'Role': instance.role,
'Content': instance.content,
};
_HunyuanResponse _$HunyuanResponseFromJson(Map<String, dynamic> json) =>
_HunyuanResponse(
note: json['Note'] as String?,
choices:
(json['Choices'] as List<dynamic>?)
?.map((e) => Choices.fromJson(e as Map<String, dynamic>))
.toList(),
created: (json['Created'] as num?)?.toInt(),
id: json['Id'] as String?,
usage:
json['Usage'] == null
? null
: Usage.fromJson(json['Usage'] as Map<String, dynamic>),
);
Map<String, dynamic> _$HunyuanResponseToJson(_HunyuanResponse instance) =>
<String, dynamic>{
if (instance.note case final value?) 'Note': value,
if (instance.choices case final value?) 'Choices': value,
if (instance.created case final value?) 'Created': value,
if (instance.id case final value?) 'Id': value,
if (instance.usage case final value?) 'Usage': value,
};
_Usage _$UsageFromJson(Map<String, dynamic> json) => _Usage(
promptTokens: (json['PromptTokens'] as num?)?.toInt(),
completionTokens: (json['CompletionTokens'] as num?)?.toInt(),
totalTokens: (json['TotalTokens'] as num?)?.toInt(),
);
Map<String, dynamic> _$UsageToJson(_Usage instance) => <String, dynamic>{
if (instance.promptTokens case final value?) 'PromptTokens': value,
if (instance.completionTokens case final value?) 'CompletionTokens': value,
if (instance.totalTokens case final value?) 'TotalTokens': value,
};
_Choices _$ChoicesFromJson(Map<String, dynamic> json) => _Choices(
finishReason: json['FinishReason'] as String?,
delta:
json['Delta'] == null
? null
: Delta.fromJson(json['Delta'] as Map<String, dynamic>),
);
Map<String, dynamic> _$ChoicesToJson(_Choices instance) => <String, dynamic>{
if (instance.finishReason case final value?) 'FinishReason': value,
if (instance.delta case final value?) 'Delta': value,
};
_Delta _$DeltaFromJson(Map<String, dynamic> json) =>
_Delta(role: json['Role'] as String?, content: json['Content'] as String?);
Map<String, dynamic> _$DeltaToJson(_Delta instance) => <String, dynamic>{
if (instance.role case final value?) 'Role': value,
if (instance.content case final value?) 'Content': value,
};

View File

@@ -1,128 +1,50 @@
class BingImage {
List<Images>? images;
Tooltips? tooltips;
import 'package:freezed_annotation/freezed_annotation.dart';
BingImage({this.images, this.tooltips});
part 'image.freezed.dart';
part 'image.g.dart';
BingImage.fromJson(Map<String, dynamic> json) {
images = json["images"] == null
? null
: (json["images"] as List).map((e) => Images.fromJson(e)).toList();
tooltips =
json["tooltips"] == null ? null : Tooltips.fromJson(json["tooltips"]);
}
@freezed
abstract class BingImage with _$BingImage {
const factory BingImage({List<Images>? images, Tooltips? tooltips}) =
_BingImage;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (images != null) {
data["images"] = images?.map((e) => e.toJson()).toList();
}
if (tooltips != null) {
data["tooltips"] = tooltips?.toJson();
}
return data;
}
factory BingImage.fromJson(Map<String, dynamic> json) =>
_$BingImageFromJson(json);
}
class Tooltips {
String? loading;
String? previous;
String? next;
String? walle;
String? walls;
@freezed
abstract class Tooltips with _$Tooltips {
const factory Tooltips({
String? loading,
String? previous,
String? next,
String? walle,
String? walls,
}) = _Tooltips;
Tooltips({this.loading, this.previous, this.next, this.walle, this.walls});
Tooltips.fromJson(Map<String, dynamic> json) {
loading = json["loading"];
previous = json["previous"];
next = json["next"];
walle = json["walle"];
walls = json["walls"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["loading"] = loading;
data["previous"] = previous;
data["next"] = next;
data["walle"] = walle;
data["walls"] = walls;
return data;
}
factory Tooltips.fromJson(Map<String, dynamic> json) =>
_$TooltipsFromJson(json);
}
class Images {
String? startdate;
String? fullstartdate;
String? enddate;
String? url;
String? urlbase;
String? copyright;
String? copyrightlink;
String? title;
String? quiz;
bool? wp;
String? hsh;
int? drk;
int? top;
int? bot;
List<dynamic>? hs;
@freezed
abstract class Images with _$Images {
const factory Images({
String? startdate,
String? fullstartdate,
String? enddate,
String? url,
String? urlbase,
String? copyright,
String? copyrightlink,
String? title,
String? quiz,
bool? wp,
String? hsh,
int? drk,
int? top,
int? bot,
List<dynamic>? hs,
}) = _Images;
Images(
{this.startdate,
this.fullstartdate,
this.enddate,
this.url,
this.urlbase,
this.copyright,
this.copyrightlink,
this.title,
this.quiz,
this.wp,
this.hsh,
this.drk,
this.top,
this.bot,
this.hs});
Images.fromJson(Map<String, dynamic> json) {
startdate = json["startdate"];
fullstartdate = json["fullstartdate"];
enddate = json["enddate"];
url = json["url"];
urlbase = json["urlbase"];
copyright = json["copyright"];
copyrightlink = json["copyrightlink"];
title = json["title"];
quiz = json["quiz"];
wp = json["wp"];
hsh = json["hsh"];
drk = json["drk"];
top = json["top"];
bot = json["bot"];
hs = json["hs"] ?? [];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["startdate"] = startdate;
data["fullstartdate"] = fullstartdate;
data["enddate"] = enddate;
data["url"] = url;
data["urlbase"] = urlbase;
data["copyright"] = copyright;
data["copyrightlink"] = copyrightlink;
data["title"] = title;
data["quiz"] = quiz;
data["wp"] = wp;
data["hsh"] = hsh;
data["drk"] = drk;
data["top"] = top;
data["bot"] = bot;
if (hs != null) {
data["hs"] = hs;
}
return data;
}
factory Images.fromJson(Map<String, dynamic> json) => _$ImagesFromJson(json);
}

View File

@@ -0,0 +1,825 @@
// dart format width=80
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'image.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$BingImage {
List<Images>? get images;
Tooltips? get tooltips;
/// Create a copy of BingImage
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$BingImageCopyWith<BingImage> get copyWith =>
_$BingImageCopyWithImpl<BingImage>(this as BingImage, _$identity);
/// Serializes this BingImage to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is BingImage &&
const DeepCollectionEquality().equals(other.images, images) &&
(identical(other.tooltips, tooltips) ||
other.tooltips == tooltips));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, const DeepCollectionEquality().hash(images), tooltips);
@override
String toString() {
return 'BingImage(images: $images, tooltips: $tooltips)';
}
}
/// @nodoc
abstract mixin class $BingImageCopyWith<$Res> {
factory $BingImageCopyWith(BingImage value,
$Res Function(BingImage) _then) = _$BingImageCopyWithImpl;
@useResult
$Res call({
List<Images>? images, Tooltips? tooltips
});
$TooltipsCopyWith<$Res>? get tooltips;
}
/// @nodoc
class _$BingImageCopyWithImpl<$Res>
implements $BingImageCopyWith<$Res> {
_$BingImageCopyWithImpl(this._self, this._then);
final BingImage _self;
final $Res Function(BingImage) _then;
/// Create a copy of BingImage
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? images = freezed, Object? tooltips = freezed,}) {
return _then(_self.copyWith(
images: freezed == images
? _self.images
: images // ignore: cast_nullable_to_non_nullable
as List<Images>?,
tooltips: freezed == tooltips
? _self.tooltips
: tooltips // ignore: cast_nullable_to_non_nullable
as Tooltips?,
));
}
/// Create a copy of BingImage
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TooltipsCopyWith<$Res>? get tooltips {
if (_self.tooltips == null) {
return null;
}
return $TooltipsCopyWith<$Res>(_self.tooltips!, (value) {
return _then(_self.copyWith(tooltips: value));
});
}
}
/// @nodoc
@JsonSerializable()
class _BingImage implements BingImage {
const _BingImage({final List<Images>? images, this.tooltips})
: _images = images;
factory _BingImage.fromJson(Map<String, dynamic> json) =>
_$BingImageFromJson(json);
final List<Images>? _images;
@override List<Images>? get images {
final value = _images;
if (value == null) return null;
if (_images is EqualUnmodifiableListView) return _images;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override final Tooltips? tooltips;
/// Create a copy of BingImage
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$BingImageCopyWith<_BingImage> get copyWith =>
__$BingImageCopyWithImpl<_BingImage>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$BingImageToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _BingImage &&
const DeepCollectionEquality().equals(other._images, _images) &&
(identical(other.tooltips, tooltips) ||
other.tooltips == tooltips));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, const DeepCollectionEquality().hash(_images), tooltips);
@override
String toString() {
return 'BingImage(images: $images, tooltips: $tooltips)';
}
}
/// @nodoc
abstract mixin class _$BingImageCopyWith<$Res>
implements $BingImageCopyWith<$Res> {
factory _$BingImageCopyWith(_BingImage value,
$Res Function(_BingImage) _then) = __$BingImageCopyWithImpl;
@override
@useResult
$Res call({
List<Images>? images, Tooltips? tooltips
});
@override $TooltipsCopyWith<$Res>? get tooltips;
}
/// @nodoc
class __$BingImageCopyWithImpl<$Res>
implements _$BingImageCopyWith<$Res> {
__$BingImageCopyWithImpl(this._self, this._then);
final _BingImage _self;
final $Res Function(_BingImage) _then;
/// Create a copy of BingImage
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call({Object? images = freezed, Object? tooltips = freezed,}) {
return _then(_BingImage(
images: freezed == images
? _self._images
: images // ignore: cast_nullable_to_non_nullable
as List<Images>?,
tooltips: freezed == tooltips
? _self.tooltips
: tooltips // ignore: cast_nullable_to_non_nullable
as Tooltips?,
));
}
/// Create a copy of BingImage
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TooltipsCopyWith<$Res>? get tooltips {
if (_self.tooltips == null) {
return null;
}
return $TooltipsCopyWith<$Res>(_self.tooltips!, (value) {
return _then(_self.copyWith(tooltips: value));
});
}
}
/// @nodoc
mixin _$Tooltips {
String? get loading;
String? get previous;
String? get next;
String? get walle;
String? get walls;
/// Create a copy of Tooltips
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TooltipsCopyWith<Tooltips> get copyWith =>
_$TooltipsCopyWithImpl<Tooltips>(this as Tooltips, _$identity);
/// Serializes this Tooltips to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Tooltips &&
(identical(other.loading, loading) || other.loading == loading) &&
(identical(other.previous, previous) ||
other.previous == previous) &&
(identical(other.next, next) || other.next == next) &&
(identical(other.walle, walle) || other.walle == walle) &&
(identical(other.walls, walls) || other.walls == walls));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(runtimeType, loading, previous, next, walle, walls);
@override
String toString() {
return 'Tooltips(loading: $loading, previous: $previous, next: $next, walle: $walle, walls: $walls)';
}
}
/// @nodoc
abstract mixin class $TooltipsCopyWith<$Res> {
factory $TooltipsCopyWith(Tooltips value,
$Res Function(Tooltips) _then) = _$TooltipsCopyWithImpl;
@useResult
$Res call({
String? loading, String? previous, String? next, String? walle, String? walls
});
}
/// @nodoc
class _$TooltipsCopyWithImpl<$Res>
implements $TooltipsCopyWith<$Res> {
_$TooltipsCopyWithImpl(this._self, this._then);
final Tooltips _self;
final $Res Function(Tooltips) _then;
/// Create a copy of Tooltips
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? loading = freezed, Object? previous = freezed, Object? next = freezed, Object? walle = freezed, Object? walls = freezed,}) {
return _then(_self.copyWith(
loading: freezed == loading
? _self.loading
: loading // ignore: cast_nullable_to_non_nullable
as String?,
previous: freezed == previous
? _self.previous
: previous // ignore: cast_nullable_to_non_nullable
as String?,
next: freezed == next
? _self.next
: next // ignore: cast_nullable_to_non_nullable
as String?,
walle: freezed == walle
? _self.walle
: walle // ignore: cast_nullable_to_non_nullable
as String?,
walls: freezed == walls
? _self.walls
: walls // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
/// @nodoc
@JsonSerializable()
class _Tooltips implements Tooltips {
const _Tooltips(
{this.loading, this.previous, this.next, this.walle, this.walls});
factory _Tooltips.fromJson(Map<String, dynamic> json) =>
_$TooltipsFromJson(json);
@override final String? loading;
@override final String? previous;
@override final String? next;
@override final String? walle;
@override final String? walls;
/// Create a copy of Tooltips
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TooltipsCopyWith<_Tooltips> get copyWith =>
__$TooltipsCopyWithImpl<_Tooltips>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$TooltipsToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _Tooltips &&
(identical(other.loading, loading) || other.loading == loading) &&
(identical(other.previous, previous) ||
other.previous == previous) &&
(identical(other.next, next) || other.next == next) &&
(identical(other.walle, walle) || other.walle == walle) &&
(identical(other.walls, walls) || other.walls == walls));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(runtimeType, loading, previous, next, walle, walls);
@override
String toString() {
return 'Tooltips(loading: $loading, previous: $previous, next: $next, walle: $walle, walls: $walls)';
}
}
/// @nodoc
abstract mixin class _$TooltipsCopyWith<$Res>
implements $TooltipsCopyWith<$Res> {
factory _$TooltipsCopyWith(_Tooltips value,
$Res Function(_Tooltips) _then) = __$TooltipsCopyWithImpl;
@override
@useResult
$Res call({
String? loading, String? previous, String? next, String? walle, String? walls
});
}
/// @nodoc
class __$TooltipsCopyWithImpl<$Res>
implements _$TooltipsCopyWith<$Res> {
__$TooltipsCopyWithImpl(this._self, this._then);
final _Tooltips _self;
final $Res Function(_Tooltips) _then;
/// Create a copy of Tooltips
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? loading = freezed, Object? previous = freezed, Object? next = freezed, Object? walle = freezed, Object? walls = freezed,}) {
return _then(_Tooltips(
loading: freezed == loading
? _self.loading
: loading // ignore: cast_nullable_to_non_nullable
as String?,
previous: freezed == previous
? _self.previous
: previous // ignore: cast_nullable_to_non_nullable
as String?,
next: freezed == next
? _self.next
: next // ignore: cast_nullable_to_non_nullable
as String?,
walle: freezed == walle
? _self.walle
: walle // ignore: cast_nullable_to_non_nullable
as String?,
walls: freezed == walls
? _self.walls
: walls // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
/// @nodoc
mixin _$Images {
String? get startdate;
String? get fullstartdate;
String? get enddate;
String? get url;
String? get urlbase;
String? get copyright;
String? get copyrightlink;
String? get title;
String? get quiz;
bool? get wp;
String? get hsh;
int? get drk;
int? get top;
int? get bot;
List<dynamic>? get hs;
/// Create a copy of Images
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$ImagesCopyWith<Images> get copyWith =>
_$ImagesCopyWithImpl<Images>(this as Images, _$identity);
/// Serializes this Images to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Images &&
(identical(other.startdate, startdate) ||
other.startdate == startdate) &&
(identical(other.fullstartdate, fullstartdate) ||
other.fullstartdate == fullstartdate) &&
(identical(other.enddate, enddate) || other.enddate == enddate) &&
(identical(other.url, url) || other.url == url) &&
(identical(other.urlbase, urlbase) || other.urlbase == urlbase) &&
(identical(other.copyright, copyright) ||
other.copyright == copyright) &&
(identical(other.copyrightlink, copyrightlink) ||
other.copyrightlink == copyrightlink) &&
(identical(other.title, title) || other.title == title) &&
(identical(other.quiz, quiz) || other.quiz == quiz) &&
(identical(other.wp, wp) || other.wp == wp) &&
(identical(other.hsh, hsh) || other.hsh == hsh) &&
(identical(other.drk, drk) || other.drk == drk) &&
(identical(other.top, top) || other.top == top) &&
(identical(other.bot, bot) || other.bot == bot) &&
const DeepCollectionEquality().equals(other.hs, hs));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
startdate,
fullstartdate,
enddate,
url,
urlbase,
copyright,
copyrightlink,
title,
quiz,
wp,
hsh,
drk,
top,
bot,
const DeepCollectionEquality().hash(hs));
@override
String toString() {
return 'Images(startdate: $startdate, fullstartdate: $fullstartdate, enddate: $enddate, url: $url, urlbase: $urlbase, copyright: $copyright, copyrightlink: $copyrightlink, title: $title, quiz: $quiz, wp: $wp, hsh: $hsh, drk: $drk, top: $top, bot: $bot, hs: $hs)';
}
}
/// @nodoc
abstract mixin class $ImagesCopyWith<$Res> {
factory $ImagesCopyWith(Images value,
$Res Function(Images) _then) = _$ImagesCopyWithImpl;
@useResult
$Res call({
String? startdate, String? fullstartdate, String? enddate, String? url, String? urlbase, String? copyright, String? copyrightlink, String? title, String? quiz, bool? wp, String? hsh, int? drk, int? top, int? bot, List<
dynamic>? hs
});
}
/// @nodoc
class _$ImagesCopyWithImpl<$Res>
implements $ImagesCopyWith<$Res> {
_$ImagesCopyWithImpl(this._self, this._then);
final Images _self;
final $Res Function(Images) _then;
/// Create a copy of Images
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? startdate = freezed, Object? fullstartdate = freezed, Object? enddate = freezed, Object? url = freezed, Object? urlbase = freezed, Object? copyright = freezed, Object? copyrightlink = freezed, Object? title = freezed, Object? quiz = freezed, Object? wp = freezed, Object? hsh = freezed, Object? drk = freezed, Object? top = freezed, Object? bot = freezed, Object? hs = freezed,}) {
return _then(_self.copyWith(
startdate: freezed == startdate
? _self.startdate
: startdate // ignore: cast_nullable_to_non_nullable
as String?,
fullstartdate: freezed == fullstartdate
? _self.fullstartdate
: fullstartdate // ignore: cast_nullable_to_non_nullable
as String?,
enddate: freezed == enddate
? _self.enddate
: enddate // ignore: cast_nullable_to_non_nullable
as String?,
url: freezed == url
? _self.url
: url // ignore: cast_nullable_to_non_nullable
as String?,
urlbase: freezed == urlbase
? _self.urlbase
: urlbase // ignore: cast_nullable_to_non_nullable
as String?,
copyright: freezed == copyright
? _self.copyright
: copyright // ignore: cast_nullable_to_non_nullable
as String?,
copyrightlink: freezed == copyrightlink
? _self.copyrightlink
: copyrightlink // ignore: cast_nullable_to_non_nullable
as String?,
title: freezed == title
? _self.title
: title // ignore: cast_nullable_to_non_nullable
as String?,
quiz: freezed == quiz
? _self.quiz
: quiz // ignore: cast_nullable_to_non_nullable
as String?,
wp: freezed == wp ? _self.wp : wp // ignore: cast_nullable_to_non_nullable
as bool?,
hsh: freezed == hsh
? _self.hsh
: hsh // ignore: cast_nullable_to_non_nullable
as String?,
drk: freezed == drk
? _self.drk
: drk // ignore: cast_nullable_to_non_nullable
as int?,
top: freezed == top
? _self.top
: top // ignore: cast_nullable_to_non_nullable
as int?,
bot: freezed == bot
? _self.bot
: bot // ignore: cast_nullable_to_non_nullable
as int?,
hs: freezed == hs ? _self.hs : hs // ignore: cast_nullable_to_non_nullable
as List<dynamic>?,
));
}
}
/// @nodoc
@JsonSerializable()
class _Images implements Images {
const _Images(
{this.startdate, this.fullstartdate, this.enddate, this.url, this.urlbase, this.copyright, this.copyrightlink, this.title, this.quiz, this.wp, this.hsh, this.drk, this.top, this.bot, final List<
dynamic>? hs}) : _hs = hs;
factory _Images.fromJson(Map<String, dynamic> json) => _$ImagesFromJson(json);
@override final String? startdate;
@override final String? fullstartdate;
@override final String? enddate;
@override final String? url;
@override final String? urlbase;
@override final String? copyright;
@override final String? copyrightlink;
@override final String? title;
@override final String? quiz;
@override final bool? wp;
@override final String? hsh;
@override final int? drk;
@override final int? top;
@override final int? bot;
final List<dynamic>? _hs;
@override List<dynamic>? get hs {
final value = _hs;
if (value == null) return null;
if (_hs is EqualUnmodifiableListView) return _hs;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
/// Create a copy of Images
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$ImagesCopyWith<_Images> get copyWith =>
__$ImagesCopyWithImpl<_Images>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$ImagesToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _Images &&
(identical(other.startdate, startdate) ||
other.startdate == startdate) &&
(identical(other.fullstartdate, fullstartdate) ||
other.fullstartdate == fullstartdate) &&
(identical(other.enddate, enddate) || other.enddate == enddate) &&
(identical(other.url, url) || other.url == url) &&
(identical(other.urlbase, urlbase) || other.urlbase == urlbase) &&
(identical(other.copyright, copyright) ||
other.copyright == copyright) &&
(identical(other.copyrightlink, copyrightlink) ||
other.copyrightlink == copyrightlink) &&
(identical(other.title, title) || other.title == title) &&
(identical(other.quiz, quiz) || other.quiz == quiz) &&
(identical(other.wp, wp) || other.wp == wp) &&
(identical(other.hsh, hsh) || other.hsh == hsh) &&
(identical(other.drk, drk) || other.drk == drk) &&
(identical(other.top, top) || other.top == top) &&
(identical(other.bot, bot) || other.bot == bot) &&
const DeepCollectionEquality().equals(other._hs, _hs));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
startdate,
fullstartdate,
enddate,
url,
urlbase,
copyright,
copyrightlink,
title,
quiz,
wp,
hsh,
drk,
top,
bot,
const DeepCollectionEquality().hash(_hs));
@override
String toString() {
return 'Images(startdate: $startdate, fullstartdate: $fullstartdate, enddate: $enddate, url: $url, urlbase: $urlbase, copyright: $copyright, copyrightlink: $copyrightlink, title: $title, quiz: $quiz, wp: $wp, hsh: $hsh, drk: $drk, top: $top, bot: $bot, hs: $hs)';
}
}
/// @nodoc
abstract mixin class _$ImagesCopyWith<$Res> implements $ImagesCopyWith<$Res> {
factory _$ImagesCopyWith(_Images value,
$Res Function(_Images) _then) = __$ImagesCopyWithImpl;
@override
@useResult
$Res call({
String? startdate, String? fullstartdate, String? enddate, String? url, String? urlbase, String? copyright, String? copyrightlink, String? title, String? quiz, bool? wp, String? hsh, int? drk, int? top, int? bot, List<
dynamic>? hs
});
}
/// @nodoc
class __$ImagesCopyWithImpl<$Res>
implements _$ImagesCopyWith<$Res> {
__$ImagesCopyWithImpl(this._self, this._then);
final _Images _self;
final $Res Function(_Images) _then;
/// Create a copy of Images
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? startdate = freezed, Object? fullstartdate = freezed, Object? enddate = freezed, Object? url = freezed, Object? urlbase = freezed, Object? copyright = freezed, Object? copyrightlink = freezed, Object? title = freezed, Object? quiz = freezed, Object? wp = freezed, Object? hsh = freezed, Object? drk = freezed, Object? top = freezed, Object? bot = freezed, Object? hs = freezed,}) {
return _then(_Images(
startdate: freezed == startdate
? _self.startdate
: startdate // ignore: cast_nullable_to_non_nullable
as String?,
fullstartdate: freezed == fullstartdate
? _self.fullstartdate
: fullstartdate // ignore: cast_nullable_to_non_nullable
as String?,
enddate: freezed == enddate
? _self.enddate
: enddate // ignore: cast_nullable_to_non_nullable
as String?,
url: freezed == url
? _self.url
: url // ignore: cast_nullable_to_non_nullable
as String?,
urlbase: freezed == urlbase
? _self.urlbase
: urlbase // ignore: cast_nullable_to_non_nullable
as String?,
copyright: freezed == copyright
? _self.copyright
: copyright // ignore: cast_nullable_to_non_nullable
as String?,
copyrightlink: freezed == copyrightlink
? _self.copyrightlink
: copyrightlink // ignore: cast_nullable_to_non_nullable
as String?,
title: freezed == title
? _self.title
: title // ignore: cast_nullable_to_non_nullable
as String?,
quiz: freezed == quiz
? _self.quiz
: quiz // ignore: cast_nullable_to_non_nullable
as String?,
wp: freezed == wp ? _self.wp : wp // ignore: cast_nullable_to_non_nullable
as bool?,
hsh: freezed == hsh
? _self.hsh
: hsh // ignore: cast_nullable_to_non_nullable
as String?,
drk: freezed == drk
? _self.drk
: drk // ignore: cast_nullable_to_non_nullable
as int?,
top: freezed == top
? _self.top
: top // ignore: cast_nullable_to_non_nullable
as int?,
bot: freezed == bot
? _self.bot
: bot // ignore: cast_nullable_to_non_nullable
as int?,
hs: freezed == hs
? _self._hs
: hs // ignore: cast_nullable_to_non_nullable
as List<dynamic>?,
));
}
}
// dart format on

View File

@@ -0,0 +1,76 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'image.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_BingImage _$BingImageFromJson(Map<String, dynamic> json) => _BingImage(
images:
(json['images'] as List<dynamic>?)
?.map((e) => Images.fromJson(e as Map<String, dynamic>))
.toList(),
tooltips:
json['tooltips'] == null
? null
: Tooltips.fromJson(json['tooltips'] as Map<String, dynamic>),
);
Map<String, dynamic> _$BingImageToJson(_BingImage instance) =>
<String, dynamic>{
if (instance.images case final value?) 'images': value,
if (instance.tooltips case final value?) 'tooltips': value,
};
_Tooltips _$TooltipsFromJson(Map<String, dynamic> json) => _Tooltips(
loading: json['loading'] as String?,
previous: json['previous'] as String?,
next: json['next'] as String?,
walle: json['walle'] as String?,
walls: json['walls'] as String?,
);
Map<String, dynamic> _$TooltipsToJson(_Tooltips instance) => <String, dynamic>{
if (instance.loading case final value?) 'loading': value,
if (instance.previous case final value?) 'previous': value,
if (instance.next case final value?) 'next': value,
if (instance.walle case final value?) 'walle': value,
if (instance.walls case final value?) 'walls': value,
};
_Images _$ImagesFromJson(Map<String, dynamic> json) => _Images(
startdate: json['startdate'] as String?,
fullstartdate: json['fullstartdate'] as String?,
enddate: json['enddate'] as String?,
url: json['url'] as String?,
urlbase: json['urlbase'] as String?,
copyright: json['copyright'] as String?,
copyrightlink: json['copyrightlink'] as String?,
title: json['title'] as String?,
quiz: json['quiz'] as String?,
wp: json['wp'] as bool?,
hsh: json['hsh'] as String?,
drk: (json['drk'] as num?)?.toInt(),
top: (json['top'] as num?)?.toInt(),
bot: (json['bot'] as num?)?.toInt(),
hs: json['hs'] as List<dynamic>?,
);
Map<String, dynamic> _$ImagesToJson(_Images instance) => <String, dynamic>{
if (instance.startdate case final value?) 'startdate': value,
if (instance.fullstartdate case final value?) 'fullstartdate': value,
if (instance.enddate case final value?) 'enddate': value,
if (instance.url case final value?) 'url': value,
if (instance.urlbase case final value?) 'urlbase': value,
if (instance.copyright case final value?) 'copyright': value,
if (instance.copyrightlink case final value?) 'copyrightlink': value,
if (instance.title case final value?) 'title': value,
if (instance.quiz case final value?) 'quiz': value,
if (instance.wp case final value?) 'wp': value,
if (instance.hsh case final value?) 'hsh': value,
if (instance.drk case final value?) 'drk': value,
if (instance.top case final value?) 'top': value,
if (instance.bot case final value?) 'bot': value,
if (instance.hs case final value?) 'hs': value,
};

View File

@@ -17,11 +17,7 @@ class Category {
Category();
Map<String, dynamic> toJson() {
return {
'id': id,
'categoryName': categoryName,
'parentId': parentId,
};
return {'id': id, 'categoryName': categoryName, 'parentId': parentId};
}
factory Category.fromJson(Map<String, dynamic> json) {

View File

@@ -20,29 +20,15 @@ const CategorySchema = IsarGeneratedSchema(
idName: 'id',
embedded: false,
properties: [
IsarPropertySchema(
name: 'id',
type: IsarType.string,
),
IsarPropertySchema(
name: 'categoryName',
type: IsarType.string,
),
IsarPropertySchema(
name: 'parentId',
type: IsarType.string,
),
IsarPropertySchema(
name: 'level',
type: IsarType.string,
),
IsarPropertySchema(name: 'id', type: IsarType.string),
IsarPropertySchema(name: 'categoryName', type: IsarType.string),
IsarPropertySchema(name: 'parentId', type: IsarType.string),
IsarPropertySchema(name: 'level', type: IsarType.string),
],
indexes: [
IsarIndexSchema(
name: 'level',
properties: [
"level",
],
properties: ["level"],
unique: false,
hash: false,
),
@@ -118,13 +104,14 @@ class _CategoryUpdateImpl implements _CategoryUpdate {
Object? parentId = ignore,
Object? level = ignore,
}) {
return collection.updateProperties([
id
], {
if (categoryName != ignore) 2: categoryName as String?,
if (parentId != ignore) 3: parentId as String?,
if (level != ignore) 4: level as String?,
}) >
return collection.updateProperties(
[id],
{
if (categoryName != ignore) 2: categoryName as String?,
if (parentId != ignore) 3: parentId as String?,
if (level != ignore) 4: level as String?,
},
) >
0;
}
}
@@ -165,11 +152,7 @@ extension CategoryUpdate on IsarCollection<String, Category> {
}
sealed class _CategoryQueryUpdate {
int call({
String? categoryName,
String? parentId,
String? level,
});
int call({String? categoryName, String? parentId, String? level});
}
class _CategoryQueryUpdateImpl implements _CategoryQueryUpdate {
@@ -240,11 +223,7 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 1, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -265,10 +244,7 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition>
idGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
idGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -286,11 +262,7 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 1, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -358,8 +330,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> idContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -372,8 +345,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> idMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -388,10 +362,7 @@ extension CategoryQueryFilter
QueryBuilder<Category, Category, QAfterFilterCondition> idIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 1,
value: '',
),
const EqualCondition(property: 1, value: ''),
);
});
}
@@ -399,10 +370,7 @@ extension CategoryQueryFilter
QueryBuilder<Category, Category, QAfterFilterCondition> idIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 1,
value: '',
),
const GreaterCondition(property: 1, value: ''),
);
});
}
@@ -413,20 +381,13 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 2,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 2, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
categoryNameGreaterThan(
String value, {
bool caseSensitive = true,
}) {
categoryNameGreaterThan(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
@@ -439,10 +400,7 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition>
categoryNameGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
categoryNameGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -460,20 +418,13 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 2,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 2, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
categoryNameLessThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
categoryNameLessThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
@@ -503,10 +454,7 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition>
categoryNameStartsWith(
String value, {
bool caseSensitive = true,
}) {
categoryNameStartsWith(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
StartsWithCondition(
@@ -534,8 +482,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> categoryNameContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -548,8 +497,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> categoryNameMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -562,25 +512,19 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition>
categoryNameIsEmpty() {
categoryNameIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 2,
value: '',
),
const EqualCondition(property: 2, value: ''),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
categoryNameIsNotEmpty() {
categoryNameIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 2,
value: '',
),
const GreaterCondition(property: 2, value: ''),
);
});
}
@@ -603,11 +547,7 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 3,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 3, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -628,10 +568,7 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition>
parentIdGreaterThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
parentIdGreaterThanOrEqualTo(String? value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -649,20 +586,13 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 3,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 3, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
parentIdLessThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
parentIdLessThanOrEqualTo(String? value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
@@ -722,8 +652,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> parentIdContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -736,8 +667,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> parentIdMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -752,10 +684,7 @@ extension CategoryQueryFilter
QueryBuilder<Category, Category, QAfterFilterCondition> parentIdIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 3,
value: '',
),
const EqualCondition(property: 3, value: ''),
);
});
}
@@ -763,10 +692,7 @@ extension CategoryQueryFilter
QueryBuilder<Category, Category, QAfterFilterCondition> parentIdIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 3,
value: '',
),
const GreaterCondition(property: 3, value: ''),
);
});
}
@@ -777,11 +703,7 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 4,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 4, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -802,10 +724,7 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition>
levelGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
levelGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -823,20 +742,13 @@ extension CategoryQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 4,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 4, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
levelLessThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
levelLessThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
@@ -896,8 +808,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> levelContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -910,8 +823,9 @@ extension CategoryQueryFilter
}
QueryBuilder<Category, Category, QAfterFilterCondition> levelMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -926,10 +840,7 @@ extension CategoryQueryFilter
QueryBuilder<Category, Category, QAfterFilterCondition> levelIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 4,
value: '',
),
const EqualCondition(property: 4, value: ''),
);
});
}
@@ -937,10 +848,7 @@ extension CategoryQueryFilter
QueryBuilder<Category, Category, QAfterFilterCondition> levelIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 4,
value: '',
),
const GreaterCondition(property: 4, value: ''),
);
});
}
@@ -950,144 +858,132 @@ extension CategoryQueryObject
on QueryBuilder<Category, Category, QFilterCondition> {}
extension CategoryQuerySortBy on QueryBuilder<Category, Category, QSortBy> {
QueryBuilder<Category, Category, QAfterSortBy> sortById(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortById({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
caseSensitive: caseSensitive,
);
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByCategoryName(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByCategoryName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
2,
caseSensitive: caseSensitive,
);
return query.addSortBy(2, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByCategoryNameDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByCategoryNameDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
2,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(2, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByParentId(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByParentId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
3,
caseSensitive: caseSensitive,
);
return query.addSortBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByParentIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByParentIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
3,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByLevel(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByLevel({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
4,
caseSensitive: caseSensitive,
);
return query.addSortBy(4, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByLevelDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> sortByLevelDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
4,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
}
extension CategoryQuerySortThenBy
on QueryBuilder<Category, Category, QSortThenBy> {
QueryBuilder<Category, Category, QAfterSortBy> thenById(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenById({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByCategoryName(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByCategoryName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(2, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByCategoryNameDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByCategoryNameDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(2, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByParentId(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByParentId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByParentIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByParentIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByLevel(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByLevel({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(4, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByLevelDesc(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterSortBy> thenByLevelDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive);
});
@@ -1096,22 +992,25 @@ extension CategoryQuerySortThenBy
extension CategoryQueryWhereDistinct
on QueryBuilder<Category, Category, QDistinct> {
QueryBuilder<Category, Category, QAfterDistinct> distinctByCategoryName(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterDistinct> distinctByCategoryName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(2, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterDistinct> distinctByParentId(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterDistinct> distinctByParentId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<Category, Category, QAfterDistinct> distinctByLevel(
{bool caseSensitive = true}) {
QueryBuilder<Category, Category, QAfterDistinct> distinctByLevel({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(4, caseSensitive: caseSensitive);
});

View File

@@ -67,6 +67,12 @@ class Diary {
// 位置信息
List<String> position = [];
// 关键词
List<String> keywords = [];
// 分词
List<String> tokenizer = [];
// 类型,富文本还是纯文本,不会为空,延迟加载
late String type;
@@ -97,6 +103,8 @@ class Diary {
const ListEquality().equals(videoName, other.videoName) &&
const ListEquality().equals(tags, other.tags) &&
const ListEquality().equals(position, other.position) &&
const ListEquality().equals(keywords, other.keywords) &&
const ListEquality().equals(tokenizer, other.tokenizer) &&
type == other.type &&
imageColor == other.imageColor &&
aspect == other.aspect;
@@ -118,6 +126,8 @@ class Diary {
const ListEquality().hash(videoName) ^
const ListEquality().hash(tags) ^
const ListEquality().hash(position) ^
const ListEquality().hash(keywords) ^
const ListEquality().hash(tokenizer) ^
type.hashCode ^
imageColor.hashCode ^
aspect.hashCode;
@@ -135,7 +145,8 @@ class Diary {
..contentText = contentText
..time = DateTime.fromMillisecondsSinceEpoch(time.millisecondsSinceEpoch)
..lastModified = DateTime.fromMillisecondsSinceEpoch(
lastModified.millisecondsSinceEpoch)
lastModified.millisecondsSinceEpoch,
)
..show = show
..mood = mood
..weather = List<String>.from(weather)
@@ -144,6 +155,8 @@ class Diary {
..videoName = List<String>.from(videoName)
..tags = List<String>.from(tags)
..position = List<String>.from(position)
..keywords = List<String>.from(keywords)
..tokenizer = List<String>.from(tokenizer)
..type = type
..imageColor = imageColor
..aspect = aspect;
@@ -167,6 +180,8 @@ class Diary {
'videoName': videoName,
'tags': tags,
'position': position,
'keywords': keywords,
'tokenizer': tokenizer,
'type': type,
'imageColor': imageColor,
'aspect': aspect,
@@ -190,6 +205,8 @@ class Diary {
..videoName = List<String>.from(json['videoName'] as List)
..tags = List<String>.from(json['tags'] as List)
..position = List<String>.from(json['position'] as List)
..keywords = List<String>.from(json['keywords'] as List)
..tokenizer = List<String>.from(json['tokenizer'] as List)
..type = json['type'] as String
..imageColor = json['imageColor'] as int?
..aspect = (json['aspect'] as num?)?.toDouble();

File diff suppressed because it is too large Load Diff

View File

@@ -20,22 +20,10 @@ const FontSchema = IsarGeneratedSchema(
idName: 'id',
embedded: false,
properties: [
IsarPropertySchema(
name: 'fontFileName',
type: IsarType.string,
),
IsarPropertySchema(
name: 'fontWghtAxisMap',
type: IsarType.json,
),
IsarPropertySchema(
name: 'fontFamily',
type: IsarType.string,
),
IsarPropertySchema(
name: 'fontType',
type: IsarType.string,
),
IsarPropertySchema(name: 'fontFileName', type: IsarType.string),
IsarPropertySchema(name: 'fontWghtAxisMap', type: IsarType.json),
IsarPropertySchema(name: 'fontFamily', type: IsarType.string),
IsarPropertySchema(name: 'fontType', type: IsarType.string),
],
indexes: [],
),
@@ -122,13 +110,14 @@ class _FontUpdateImpl implements _FontUpdate {
Object? fontFamily = ignore,
Object? fontType = ignore,
}) {
return collection.updateProperties([
id
], {
if (fontFileName != ignore) 1: fontFileName as String?,
if (fontFamily != ignore) 3: fontFamily as String?,
if (fontType != ignore) 4: fontType as String?,
}) >
return collection.updateProperties(
[id],
{
if (fontFileName != ignore) 1: fontFileName as String?,
if (fontFamily != ignore) 3: fontFamily as String?,
if (fontType != ignore) 4: fontType as String?,
},
) >
0;
}
}
@@ -169,11 +158,7 @@ extension FontUpdate on IsarCollection<int, Font> {
}
sealed class _FontQueryUpdate {
int call({
String? fontFileName,
String? fontFamily,
String? fontType,
});
int call({String? fontFileName, String? fontFamily, String? fontType});
}
class _FontQueryUpdateImpl implements _FontQueryUpdate {
@@ -241,11 +226,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 1, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -266,10 +247,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition>
fontFileNameGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
fontFileNameGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -287,11 +265,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 1, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -359,8 +333,9 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition> fontFileNameContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -373,8 +348,9 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition> fontFileNameMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -389,10 +365,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
QueryBuilder<Font, Font, QAfterFilterCondition> fontFileNameIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 1,
value: '',
),
const EqualCondition(property: 1, value: ''),
);
});
}
@@ -400,36 +373,23 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
QueryBuilder<Font, Font, QAfterFilterCondition> fontFileNameIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 1,
value: '',
),
const GreaterCondition(property: 1, value: ''),
);
});
}
QueryBuilder<Font, Font, QAfterFilterCondition> idEqualTo(
int value,
) {
QueryBuilder<Font, Font, QAfterFilterCondition> idEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 0,
value: value,
),
EqualCondition(property: 0, value: value),
);
});
}
QueryBuilder<Font, Font, QAfterFilterCondition> idGreaterThan(
int value,
) {
QueryBuilder<Font, Font, QAfterFilterCondition> idGreaterThan(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 0,
value: value,
),
GreaterCondition(property: 0, value: value),
);
});
}
@@ -439,24 +399,14 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 0,
value: value,
),
GreaterOrEqualCondition(property: 0, value: value),
);
});
}
QueryBuilder<Font, Font, QAfterFilterCondition> idLessThan(
int value,
) {
QueryBuilder<Font, Font, QAfterFilterCondition> idLessThan(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 0,
value: value,
),
);
return query.addFilterCondition(LessCondition(property: 0, value: value));
});
}
@@ -465,10 +415,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 0,
value: value,
),
LessOrEqualCondition(property: 0, value: value),
);
});
}
@@ -479,11 +426,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 0,
lower: lower,
upper: upper,
),
BetweenCondition(property: 0, lower: lower, upper: upper),
);
});
}
@@ -494,11 +437,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 3,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 3, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -519,10 +458,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition>
fontFamilyGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
fontFamilyGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -540,11 +476,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 3,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 3, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -612,8 +544,9 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition> fontFamilyContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -626,8 +559,9 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition> fontFamilyMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -642,10 +576,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
QueryBuilder<Font, Font, QAfterFilterCondition> fontFamilyIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 3,
value: '',
),
const EqualCondition(property: 3, value: ''),
);
});
}
@@ -653,10 +584,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
QueryBuilder<Font, Font, QAfterFilterCondition> fontFamilyIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 3,
value: '',
),
const GreaterCondition(property: 3, value: ''),
);
});
}
@@ -667,11 +595,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 4,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 4, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -712,11 +636,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 4,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 4, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -783,8 +703,10 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
});
}
QueryBuilder<Font, Font, QAfterFilterCondition> fontTypeContains(String value,
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterFilterCondition> fontTypeContains(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -797,8 +719,9 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
}
QueryBuilder<Font, Font, QAfterFilterCondition> fontTypeMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -813,10 +736,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
QueryBuilder<Font, Font, QAfterFilterCondition> fontTypeIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 4,
value: '',
),
const EqualCondition(property: 4, value: ''),
);
});
}
@@ -824,10 +744,7 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
QueryBuilder<Font, Font, QAfterFilterCondition> fontTypeIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 4,
value: '',
),
const GreaterCondition(property: 4, value: ''),
);
});
}
@@ -836,24 +753,19 @@ extension FontQueryFilter on QueryBuilder<Font, Font, QFilterCondition> {
extension FontQueryObject on QueryBuilder<Font, Font, QFilterCondition> {}
extension FontQuerySortBy on QueryBuilder<Font, Font, QSortBy> {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFileName(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFileName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
caseSensitive: caseSensitive,
);
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFileNameDesc(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFileNameDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
@@ -881,59 +793,51 @@ extension FontQuerySortBy on QueryBuilder<Font, Font, QSortBy> {
});
}
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFamily(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFamily({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
3,
caseSensitive: caseSensitive,
);
return query.addSortBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFamilyDesc(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontFamilyDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
3,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> sortByFontType(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontType({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
4,
caseSensitive: caseSensitive,
);
return query.addSortBy(4, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> sortByFontTypeDesc(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> sortByFontTypeDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
4,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
}
extension FontQuerySortThenBy on QueryBuilder<Font, Font, QSortThenBy> {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFileName(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFileName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFileNameDesc(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFileNameDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
@@ -963,29 +867,33 @@ extension FontQuerySortThenBy on QueryBuilder<Font, Font, QSortThenBy> {
});
}
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFamily(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFamily({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFamilyDesc(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontFamilyDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> thenByFontType(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontType({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(4, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterSortBy> thenByFontTypeDesc(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterSortBy> thenByFontTypeDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive);
});
@@ -993,8 +901,9 @@ extension FontQuerySortThenBy on QueryBuilder<Font, Font, QSortThenBy> {
}
extension FontQueryWhereDistinct on QueryBuilder<Font, Font, QDistinct> {
QueryBuilder<Font, Font, QAfterDistinct> distinctByFontFileName(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterDistinct> distinctByFontFileName({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(1, caseSensitive: caseSensitive);
});
@@ -1006,15 +915,17 @@ extension FontQueryWhereDistinct on QueryBuilder<Font, Font, QDistinct> {
});
}
QueryBuilder<Font, Font, QAfterDistinct> distinctByFontFamily(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterDistinct> distinctByFontFamily({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<Font, Font, QAfterDistinct> distinctByFontType(
{bool caseSensitive = true}) {
QueryBuilder<Font, Font, QAfterDistinct> distinctByFontType({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(4, caseSensitive: caseSensitive);
});
@@ -1029,7 +940,7 @@ extension FontQueryProperty1 on QueryBuilder<Font, Font, QProperty> {
}
QueryBuilder<Font, Map<String, dynamic>, QAfterProperty>
fontWghtAxisMapProperty() {
fontWghtAxisMapProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(2);
});
@@ -1062,7 +973,7 @@ extension FontQueryProperty2<R> on QueryBuilder<Font, R, QAfterProperty> {
}
QueryBuilder<Font, (R, Map<String, dynamic>), QAfterProperty>
fontWghtAxisMapProperty() {
fontWghtAxisMapProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(2);
});
@@ -1096,7 +1007,7 @@ extension FontQueryProperty3<R1, R2>
}
QueryBuilder<Font, (R1, R2, Map<String, dynamic>), QOperations>
fontWghtAxisMapProperty() {
fontWghtAxisMapProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(2);
});

View File

@@ -20,22 +20,10 @@ const SyncRecordSchema = IsarGeneratedSchema(
idName: 'isarId',
embedded: false,
properties: [
IsarPropertySchema(
name: 'syncId',
type: IsarType.string,
),
IsarPropertySchema(
name: 'diaryId',
type: IsarType.string,
),
IsarPropertySchema(
name: 'diaryJson',
type: IsarType.string,
),
IsarPropertySchema(
name: 'time',
type: IsarType.dateTime,
),
IsarPropertySchema(name: 'syncId', type: IsarType.string),
IsarPropertySchema(name: 'diaryId', type: IsarType.string),
IsarPropertySchema(name: 'diaryJson', type: IsarType.string),
IsarPropertySchema(name: 'time', type: IsarType.dateTime),
IsarPropertySchema(
name: 'syncType',
type: IsarType.byte,
@@ -104,8 +92,10 @@ dynamic deserializeSyncRecordProp(IsarReader reader, int property) {
if (value == -9223372036854775808) {
return DateTime.fromMillisecondsSinceEpoch(0, isUtc: true).toLocal();
} else {
return DateTime.fromMicrosecondsSinceEpoch(value, isUtc: true)
.toLocal();
return DateTime.fromMicrosecondsSinceEpoch(
value,
isUtc: true,
).toLocal();
}
}
case 5:
@@ -149,15 +139,16 @@ class _SyncRecordUpdateImpl implements _SyncRecordUpdate {
Object? time = ignore,
Object? syncType = ignore,
}) {
return collection.updateProperties([
isarId
], {
if (syncId != ignore) 1: syncId as String?,
if (diaryId != ignore) 2: diaryId as String?,
if (diaryJson != ignore) 3: diaryJson as String?,
if (time != ignore) 4: time as DateTime?,
if (syncType != ignore) 5: syncType as SyncType?,
}) >
return collection.updateProperties(
[isarId],
{
if (syncId != ignore) 1: syncId as String?,
if (diaryId != ignore) 2: diaryId as String?,
if (diaryJson != ignore) 3: diaryJson as String?,
if (time != ignore) 4: time as DateTime?,
if (syncType != ignore) 5: syncType as SyncType?,
},
) >
0;
}
}
@@ -297,11 +288,7 @@ extension SyncRecordQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 1, value: value, caseSensitive: caseSensitive),
);
});
}
@@ -322,10 +309,7 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
syncIdGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
syncIdGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -343,20 +327,13 @@ extension SyncRecordQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 1, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
syncIdLessThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
syncIdLessThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
@@ -416,8 +393,9 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> syncIdContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -430,8 +408,9 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> syncIdMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -446,22 +425,16 @@ extension SyncRecordQueryFilter
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> syncIdIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 1,
value: '',
),
const EqualCondition(property: 1, value: ''),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
syncIdIsNotEmpty() {
syncIdIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 1,
value: '',
),
const GreaterCondition(property: 1, value: ''),
);
});
}
@@ -472,20 +445,13 @@ extension SyncRecordQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 2,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 2, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryIdGreaterThan(
String value, {
bool caseSensitive = true,
}) {
diaryIdGreaterThan(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
@@ -498,10 +464,7 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryIdGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
diaryIdGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -519,20 +482,13 @@ extension SyncRecordQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 2,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 2, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryIdLessThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
diaryIdLessThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
@@ -592,8 +548,9 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> diaryIdContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -606,8 +563,9 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> diaryIdMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -622,22 +580,16 @@ extension SyncRecordQueryFilter
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> diaryIdIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 2,
value: '',
),
const EqualCondition(property: 2, value: ''),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryIdIsNotEmpty() {
diaryIdIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 2,
value: '',
),
const GreaterCondition(property: 2, value: ''),
);
});
}
@@ -648,20 +600,13 @@ extension SyncRecordQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 3,
value: value,
caseSensitive: caseSensitive,
),
EqualCondition(property: 3, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryJsonGreaterThan(
String value, {
bool caseSensitive = true,
}) {
diaryJsonGreaterThan(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
@@ -674,10 +619,7 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryJsonGreaterThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
diaryJsonGreaterThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
@@ -695,20 +637,13 @@ extension SyncRecordQueryFilter
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 3,
value: value,
caseSensitive: caseSensitive,
),
LessCondition(property: 3, value: value, caseSensitive: caseSensitive),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryJsonLessThanOrEqualTo(
String value, {
bool caseSensitive = true,
}) {
diaryJsonLessThanOrEqualTo(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
@@ -738,10 +673,7 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryJsonStartsWith(
String value, {
bool caseSensitive = true,
}) {
diaryJsonStartsWith(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
StartsWithCondition(
@@ -769,8 +701,9 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> diaryJsonContains(
String value,
{bool caseSensitive = true}) {
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
@@ -783,8 +716,9 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition> diaryJsonMatches(
String pattern,
{bool caseSensitive = true}) {
String pattern, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
@@ -797,25 +731,19 @@ extension SyncRecordQueryFilter
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryJsonIsEmpty() {
diaryJsonIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 3,
value: '',
),
const EqualCondition(property: 3, value: ''),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
diaryJsonIsNotEmpty() {
diaryJsonIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 3,
value: '',
),
const GreaterCondition(property: 3, value: ''),
);
});
}
@@ -825,10 +753,7 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 4,
value: value,
),
EqualCondition(property: 4, value: value),
);
});
}
@@ -838,24 +763,16 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 4,
value: value,
),
GreaterCondition(property: 4, value: value),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
timeGreaterThanOrEqualTo(
DateTime value,
) {
timeGreaterThanOrEqualTo(DateTime value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 4,
value: value,
),
GreaterOrEqualCondition(property: 4, value: value),
);
});
}
@@ -864,25 +781,15 @@ extension SyncRecordQueryFilter
DateTime value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 4,
value: value,
),
);
return query.addFilterCondition(LessCondition(property: 4, value: value));
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
timeLessThanOrEqualTo(
DateTime value,
) {
timeLessThanOrEqualTo(DateTime value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 4,
value: value,
),
LessOrEqualCondition(property: 4, value: value),
);
});
}
@@ -893,11 +800,7 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 4,
lower: lower,
upper: upper,
),
BetweenCondition(property: 4, lower: lower, upper: upper),
);
});
}
@@ -907,38 +810,25 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 5,
value: value.index,
),
EqualCondition(property: 5, value: value.index),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
syncTypeGreaterThan(
SyncType value,
) {
syncTypeGreaterThan(SyncType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 5,
value: value.index,
),
GreaterCondition(property: 5, value: value.index),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
syncTypeGreaterThanOrEqualTo(
SyncType value,
) {
syncTypeGreaterThanOrEqualTo(SyncType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 5,
value: value.index,
),
GreaterOrEqualCondition(property: 5, value: value.index),
);
});
}
@@ -948,24 +838,16 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 5,
value: value.index,
),
LessCondition(property: 5, value: value.index),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
syncTypeLessThanOrEqualTo(
SyncType value,
) {
syncTypeLessThanOrEqualTo(SyncType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 5,
value: value.index,
),
LessOrEqualCondition(property: 5, value: value.index),
);
});
}
@@ -976,11 +858,7 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 5,
lower: lower.index,
upper: upper.index,
),
BetweenCondition(property: 5, lower: lower.index, upper: upper.index),
);
});
}
@@ -990,10 +868,7 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 0,
value: value,
),
EqualCondition(property: 0, value: value),
);
});
}
@@ -1003,24 +878,16 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 0,
value: value,
),
GreaterCondition(property: 0, value: value),
);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
isarIdGreaterThanOrEqualTo(
int value,
) {
isarIdGreaterThanOrEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 0,
value: value,
),
GreaterOrEqualCondition(property: 0, value: value),
);
});
}
@@ -1029,25 +896,15 @@ extension SyncRecordQueryFilter
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 0,
value: value,
),
);
return query.addFilterCondition(LessCondition(property: 0, value: value));
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterFilterCondition>
isarIdLessThanOrEqualTo(
int value,
) {
isarIdLessThanOrEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 0,
value: value,
),
LessOrEqualCondition(property: 0, value: value),
);
});
}
@@ -1058,11 +915,7 @@ extension SyncRecordQueryFilter
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 0,
lower: lower,
upper: upper,
),
BetweenCondition(property: 0, lower: lower, upper: upper),
);
});
}
@@ -1073,66 +926,51 @@ extension SyncRecordQueryObject
extension SyncRecordQuerySortBy
on QueryBuilder<SyncRecord, SyncRecord, QSortBy> {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortBySyncId(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortBySyncId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
caseSensitive: caseSensitive,
);
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortBySyncIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortBySyncIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryId(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
2,
caseSensitive: caseSensitive,
);
return query.addSortBy(2, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
2,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(2, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryJson(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryJson({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
3,
caseSensitive: caseSensitive,
);
return query.addSortBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryJsonDesc(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> sortByDiaryJsonDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
3,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
@@ -1175,43 +1013,49 @@ extension SyncRecordQuerySortBy
extension SyncRecordQuerySortThenBy
on QueryBuilder<SyncRecord, SyncRecord, QSortThenBy> {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenBySyncId(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenBySyncId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenBySyncIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenBySyncIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryId(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(2, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryIdDesc(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryIdDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(2, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryJson(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryJson({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(3, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryJsonDesc(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterSortBy> thenByDiaryJsonDesc({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive);
});
@@ -1256,22 +1100,25 @@ extension SyncRecordQuerySortThenBy
extension SyncRecordQueryWhereDistinct
on QueryBuilder<SyncRecord, SyncRecord, QDistinct> {
QueryBuilder<SyncRecord, SyncRecord, QAfterDistinct> distinctBySyncId(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterDistinct> distinctBySyncId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterDistinct> distinctByDiaryId(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterDistinct> distinctByDiaryId({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(2, caseSensitive: caseSensitive);
});
}
QueryBuilder<SyncRecord, SyncRecord, QAfterDistinct> distinctByDiaryJson(
{bool caseSensitive = true}) {
QueryBuilder<SyncRecord, SyncRecord, QAfterDistinct> distinctByDiaryJson({
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(3, caseSensitive: caseSensitive);
});

View File

@@ -16,31 +16,34 @@ class ShiplyResponse {
int? updateStrategy;
int? updateTime;
ShiplyResponse(
{this.apkBasicInfo,
this.clientInfo,
this.extra,
this.grayType,
this.newFeature,
this.popInterval,
this.popTimes,
this.publishTime,
this.receiveMoment,
this.remindType,
this.status,
this.tacticsId,
this.title,
this.undisturbedDuration,
this.updateStrategy,
this.updateTime});
ShiplyResponse({
this.apkBasicInfo,
this.clientInfo,
this.extra,
this.grayType,
this.newFeature,
this.popInterval,
this.popTimes,
this.publishTime,
this.receiveMoment,
this.remindType,
this.status,
this.tacticsId,
this.title,
this.undisturbedDuration,
this.updateStrategy,
this.updateTime,
});
ShiplyResponse.fromJson(Map<String, dynamic> json) {
apkBasicInfo = json["apkBasicInfo"] == null
? null
: ApkBasicInfo.fromJson(json["apkBasicInfo"]);
clientInfo = json["clientInfo"] == null
? null
: ClientInfo.fromJson(json["clientInfo"]);
apkBasicInfo =
json["apkBasicInfo"] == null
? null
: ApkBasicInfo.fromJson(json["apkBasicInfo"]);
clientInfo =
json["clientInfo"] == null
? null
: ClientInfo.fromJson(json["clientInfo"]);
extra = json["extra"] == null ? null : Extra.fromJson(json["extra"]);
grayType = json["grayType"];
newFeature = json["newFeature"];
@@ -129,15 +132,16 @@ class ApkBasicInfo {
int? versionCode;
String? version;
ApkBasicInfo(
{this.md5,
this.pkgSize,
this.buildNo,
this.bundleId,
this.downloadUrl,
this.pkgName,
this.versionCode,
this.version});
ApkBasicInfo({
this.md5,
this.pkgSize,
this.buildNo,
this.bundleId,
this.downloadUrl,
this.pkgName,
this.versionCode,
this.version,
});
ApkBasicInfo.fromJson(Map<String, dynamic> json) {
md5 = json["md5"];

View File

@@ -4,8 +4,5 @@ class SyncResult<T> {
final SyncStatus status;
T? data;
SyncResult({
required this.status,
this.data,
});
SyncResult({required this.status, this.data});
}

View File

@@ -104,10 +104,12 @@ class RawResult {
});
List<int> getAnswerIndices() {
final int startIndex =
startLogits.indexOf(startLogits.reduce((a, b) => a > b ? a : b));
final int endIndex =
endLogits.indexOf(endLogits.reduce((a, b) => a > b ? a : b));
final int startIndex = startLogits.indexOf(
startLogits.reduce((a, b) => a > b ? a : b),
);
final int endIndex = endLogits.indexOf(
endLogits.reduce((a, b) => a > b ? a : b),
);
return [startIndex, endIndex];
}

View File

@@ -1,130 +1,48 @@
class WeatherResponse {
String? code;
String? updateTime;
String? fxLink;
Now? now;
Refer? refer;
import 'package:freezed_annotation/freezed_annotation.dart';
WeatherResponse(
{this.code, this.updateTime, this.fxLink, this.now, this.refer});
part 'weather.freezed.dart';
part 'weather.g.dart';
WeatherResponse.fromJson(Map<String, dynamic> json) {
code = json["code"];
updateTime = json["updateTime"];
fxLink = json["fxLink"];
now = json["now"] == null ? null : Now.fromJson(json["now"]);
refer = json["refer"] == null ? null : Refer.fromJson(json["refer"]);
}
@freezed
abstract class WeatherResponse with _$WeatherResponse {
const factory WeatherResponse({
String? code,
String? updateTime,
String? fxLink,
Now? now,
Refer? refer,
}) = _WeatherResponse;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["code"] = code;
data["updateTime"] = updateTime;
data["fxLink"] = fxLink;
if (now != null) {
data["now"] = now?.toJson();
}
if (refer != null) {
data["refer"] = refer?.toJson();
}
return data;
}
factory WeatherResponse.fromJson(Map<String, dynamic> json) =>
_$WeatherResponseFromJson(json);
}
class Refer {
List<String>? sources;
List<String>? license;
@freezed
abstract class Refer with _$Refer {
const factory Refer({List<String>? sources, List<String>? license}) = _Refer;
Refer({this.sources, this.license});
Refer.fromJson(Map<String, dynamic> json) {
sources =
json["sources"] == null ? null : List<String>.from(json["sources"]);
license =
json["license"] == null ? null : List<String>.from(json["license"]);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (sources != null) {
data["sources"] = sources;
}
if (license != null) {
data["license"] = license;
}
return data;
}
factory Refer.fromJson(Map<String, dynamic> json) => _$ReferFromJson(json);
}
class Now {
String? obsTime;
String? temp;
String? feelsLike;
String? icon;
String? text;
String? wind360;
String? windDir;
String? windScale;
String? windSpeed;
String? humidity;
String? precip;
String? pressure;
String? vis;
String? cloud;
String? dew;
@freezed
abstract class Now with _$Now {
const factory Now({
String? obsTime,
String? temp,
String? feelsLike,
String? icon,
String? text,
String? wind360,
String? windDir,
String? windScale,
String? windSpeed,
String? humidity,
String? precip,
String? pressure,
String? vis,
String? cloud,
String? dew,
}) = _Now;
Now(
{this.obsTime,
this.temp,
this.feelsLike,
this.icon,
this.text,
this.wind360,
this.windDir,
this.windScale,
this.windSpeed,
this.humidity,
this.precip,
this.pressure,
this.vis,
this.cloud,
this.dew});
Now.fromJson(Map<String, dynamic> json) {
obsTime = json["obsTime"];
temp = json["temp"];
feelsLike = json["feelsLike"];
icon = json["icon"];
text = json["text"];
wind360 = json["wind360"];
windDir = json["windDir"];
windScale = json["windScale"];
windSpeed = json["windSpeed"];
humidity = json["humidity"];
precip = json["precip"];
pressure = json["pressure"];
vis = json["vis"];
cloud = json["cloud"];
dew = json["dew"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data["obsTime"] = obsTime;
data["temp"] = temp;
data["feelsLike"] = feelsLike;
data["icon"] = icon;
data["text"] = text;
data["wind360"] = wind360;
data["windDir"] = windDir;
data["windScale"] = windScale;
data["windSpeed"] = windSpeed;
data["humidity"] = humidity;
data["precip"] = precip;
data["pressure"] = pressure;
data["vis"] = vis;
data["cloud"] = cloud;
data["dew"] = dew;
return data;
}
factory Now.fromJson(Map<String, dynamic> json) => _$NowFromJson(json);
}

View File

@@ -0,0 +1,861 @@
// dart format width=80
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'weather.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$WeatherResponse {
String? get code;
String? get updateTime;
String? get fxLink;
Now? get now;
Refer? get refer;
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$WeatherResponseCopyWith<WeatherResponse> get copyWith =>
_$WeatherResponseCopyWithImpl<WeatherResponse>(
this as WeatherResponse, _$identity);
/// Serializes this WeatherResponse to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is WeatherResponse &&
(identical(other.code, code) || other.code == code) &&
(identical(other.updateTime, updateTime) ||
other.updateTime == updateTime) &&
(identical(other.fxLink, fxLink) || other.fxLink == fxLink) &&
(identical(other.now, now) || other.now == now) &&
(identical(other.refer, refer) || other.refer == refer));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(runtimeType, code, updateTime, fxLink, now, refer);
@override
String toString() {
return 'WeatherResponse(code: $code, updateTime: $updateTime, fxLink: $fxLink, now: $now, refer: $refer)';
}
}
/// @nodoc
abstract mixin class $WeatherResponseCopyWith<$Res> {
factory $WeatherResponseCopyWith(WeatherResponse value,
$Res Function(WeatherResponse) _then) = _$WeatherResponseCopyWithImpl;
@useResult
$Res call({
String? code, String? updateTime, String? fxLink, Now? now, Refer? refer
});
$NowCopyWith<$Res>? get now;
$ReferCopyWith<$Res>? get refer;
}
/// @nodoc
class _$WeatherResponseCopyWithImpl<$Res>
implements $WeatherResponseCopyWith<$Res> {
_$WeatherResponseCopyWithImpl(this._self, this._then);
final WeatherResponse _self;
final $Res Function(WeatherResponse) _then;
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? code = freezed, Object? updateTime = freezed, Object? fxLink = freezed, Object? now = freezed, Object? refer = freezed,}) {
return _then(_self.copyWith(
code: freezed == code
? _self.code
: code // ignore: cast_nullable_to_non_nullable
as String?,
updateTime: freezed == updateTime
? _self.updateTime
: updateTime // ignore: cast_nullable_to_non_nullable
as String?,
fxLink: freezed == fxLink
? _self.fxLink
: fxLink // ignore: cast_nullable_to_non_nullable
as String?,
now: freezed == now
? _self.now
: now // ignore: cast_nullable_to_non_nullable
as Now?,
refer: freezed == refer
? _self.refer
: refer // ignore: cast_nullable_to_non_nullable
as Refer?,
));
}
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$NowCopyWith<$Res>? get now {
if (_self.now == null) {
return null;
}
return $NowCopyWith<$Res>(_self.now!, (value) {
return _then(_self.copyWith(now: value));
});
}
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$ReferCopyWith<$Res>? get refer {
if (_self.refer == null) {
return null;
}
return $ReferCopyWith<$Res>(_self.refer!, (value) {
return _then(_self.copyWith(refer: value));
});
}
}
/// @nodoc
@JsonSerializable()
class _WeatherResponse implements WeatherResponse {
const _WeatherResponse(
{this.code, this.updateTime, this.fxLink, this.now, this.refer});
factory _WeatherResponse.fromJson(Map<String, dynamic> json) =>
_$WeatherResponseFromJson(json);
@override final String? code;
@override final String? updateTime;
@override final String? fxLink;
@override final Now? now;
@override final Refer? refer;
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$WeatherResponseCopyWith<_WeatherResponse> get copyWith =>
__$WeatherResponseCopyWithImpl<_WeatherResponse>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$WeatherResponseToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _WeatherResponse &&
(identical(other.code, code) || other.code == code) &&
(identical(other.updateTime, updateTime) ||
other.updateTime == updateTime) &&
(identical(other.fxLink, fxLink) || other.fxLink == fxLink) &&
(identical(other.now, now) || other.now == now) &&
(identical(other.refer, refer) || other.refer == refer));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(runtimeType, code, updateTime, fxLink, now, refer);
@override
String toString() {
return 'WeatherResponse(code: $code, updateTime: $updateTime, fxLink: $fxLink, now: $now, refer: $refer)';
}
}
/// @nodoc
abstract mixin class _$WeatherResponseCopyWith<$Res>
implements $WeatherResponseCopyWith<$Res> {
factory _$WeatherResponseCopyWith(_WeatherResponse value,
$Res Function(_WeatherResponse) _then) = __$WeatherResponseCopyWithImpl;
@override
@useResult
$Res call({
String? code, String? updateTime, String? fxLink, Now? now, Refer? refer
});
@override $NowCopyWith<$Res>? get now;
@override $ReferCopyWith<$Res>? get refer;
}
/// @nodoc
class __$WeatherResponseCopyWithImpl<$Res>
implements _$WeatherResponseCopyWith<$Res> {
__$WeatherResponseCopyWithImpl(this._self, this._then);
final _WeatherResponse _self;
final $Res Function(_WeatherResponse) _then;
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? code = freezed, Object? updateTime = freezed, Object? fxLink = freezed, Object? now = freezed, Object? refer = freezed,}) {
return _then(_WeatherResponse(
code: freezed == code
? _self.code
: code // ignore: cast_nullable_to_non_nullable
as String?,
updateTime: freezed == updateTime
? _self.updateTime
: updateTime // ignore: cast_nullable_to_non_nullable
as String?,
fxLink: freezed == fxLink
? _self.fxLink
: fxLink // ignore: cast_nullable_to_non_nullable
as String?,
now: freezed == now
? _self.now
: now // ignore: cast_nullable_to_non_nullable
as Now?,
refer: freezed == refer
? _self.refer
: refer // ignore: cast_nullable_to_non_nullable
as Refer?,
));
}
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$NowCopyWith<$Res>? get now {
if (_self.now == null) {
return null;
}
return $NowCopyWith<$Res>(_self.now!, (value) {
return _then(_self.copyWith(now: value));
});
}
/// Create a copy of WeatherResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$ReferCopyWith<$Res>? get refer {
if (_self.refer == null) {
return null;
}
return $ReferCopyWith<$Res>(_self.refer!, (value) {
return _then(_self.copyWith(refer: value));
});
}
}
/// @nodoc
mixin _$Refer {
List<String>? get sources;
List<String>? get license;
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$ReferCopyWith<Refer> get copyWith =>
_$ReferCopyWithImpl<Refer>(this as Refer, _$identity);
/// Serializes this Refer to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Refer &&
const DeepCollectionEquality().equals(other.sources, sources) &&
const DeepCollectionEquality().equals(other.license, license));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, const DeepCollectionEquality().hash(sources),
const DeepCollectionEquality().hash(license));
@override
String toString() {
return 'Refer(sources: $sources, license: $license)';
}
}
/// @nodoc
abstract mixin class $ReferCopyWith<$Res> {
factory $ReferCopyWith(Refer value,
$Res Function(Refer) _then) = _$ReferCopyWithImpl;
@useResult
$Res call({
List<String>? sources, List<String>? license
});
}
/// @nodoc
class _$ReferCopyWithImpl<$Res>
implements $ReferCopyWith<$Res> {
_$ReferCopyWithImpl(this._self, this._then);
final Refer _self;
final $Res Function(Refer) _then;
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? sources = freezed, Object? license = freezed,}) {
return _then(_self.copyWith(
sources: freezed == sources
? _self.sources
: sources // ignore: cast_nullable_to_non_nullable
as List<String>?,
license: freezed == license
? _self.license
: license // ignore: cast_nullable_to_non_nullable
as List<String>?,
));
}
}
/// @nodoc
@JsonSerializable()
class _Refer implements Refer {
const _Refer({final List<String>? sources, final List<String>? license})
: _sources = sources,
_license = license;
factory _Refer.fromJson(Map<String, dynamic> json) => _$ReferFromJson(json);
final List<String>? _sources;
@override List<String>? get sources {
final value = _sources;
if (value == null) return null;
if (_sources is EqualUnmodifiableListView) return _sources;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
final List<String>? _license;
@override List<String>? get license {
final value = _license;
if (value == null) return null;
if (_license is EqualUnmodifiableListView) return _license;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$ReferCopyWith<_Refer> get copyWith =>
__$ReferCopyWithImpl<_Refer>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$ReferToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _Refer &&
const DeepCollectionEquality().equals(other._sources, _sources) &&
const DeepCollectionEquality().equals(other._license, _license));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType, const DeepCollectionEquality().hash(_sources),
const DeepCollectionEquality().hash(_license));
@override
String toString() {
return 'Refer(sources: $sources, license: $license)';
}
}
/// @nodoc
abstract mixin class _$ReferCopyWith<$Res> implements $ReferCopyWith<$Res> {
factory _$ReferCopyWith(_Refer value,
$Res Function(_Refer) _then) = __$ReferCopyWithImpl;
@override
@useResult
$Res call({
List<String>? sources, List<String>? license
});
}
/// @nodoc
class __$ReferCopyWithImpl<$Res>
implements _$ReferCopyWith<$Res> {
__$ReferCopyWithImpl(this._self, this._then);
final _Refer _self;
final $Res Function(_Refer) _then;
/// Create a copy of Refer
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call({Object? sources = freezed, Object? license = freezed,}) {
return _then(_Refer(
sources: freezed == sources
? _self._sources
: sources // ignore: cast_nullable_to_non_nullable
as List<String>?,
license: freezed == license
? _self._license
: license // ignore: cast_nullable_to_non_nullable
as List<String>?,
));
}
}
/// @nodoc
mixin _$Now {
String? get obsTime;
String? get temp;
String? get feelsLike;
String? get icon;
String? get text;
String? get wind360;
String? get windDir;
String? get windScale;
String? get windSpeed;
String? get humidity;
String? get precip;
String? get pressure;
String? get vis;
String? get cloud;
String? get dew;
/// Create a copy of Now
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$NowCopyWith<Now> get copyWith =>
_$NowCopyWithImpl<Now>(this as Now, _$identity);
/// Serializes this Now to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Now &&
(identical(other.obsTime, obsTime) || other.obsTime == obsTime) &&
(identical(other.temp, temp) || other.temp == temp) &&
(identical(other.feelsLike, feelsLike) ||
other.feelsLike == feelsLike) &&
(identical(other.icon, icon) || other.icon == icon) &&
(identical(other.text, text) || other.text == text) &&
(identical(other.wind360, wind360) || other.wind360 == wind360) &&
(identical(other.windDir, windDir) || other.windDir == windDir) &&
(identical(other.windScale, windScale) ||
other.windScale == windScale) &&
(identical(other.windSpeed, windSpeed) ||
other.windSpeed == windSpeed) &&
(identical(other.humidity, humidity) ||
other.humidity == humidity) &&
(identical(other.precip, precip) || other.precip == precip) &&
(identical(other.pressure, pressure) ||
other.pressure == pressure) &&
(identical(other.vis, vis) || other.vis == vis) &&
(identical(other.cloud, cloud) || other.cloud == cloud) &&
(identical(other.dew, dew) || other.dew == dew));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
obsTime,
temp,
feelsLike,
icon,
text,
wind360,
windDir,
windScale,
windSpeed,
humidity,
precip,
pressure,
vis,
cloud,
dew);
@override
String toString() {
return 'Now(obsTime: $obsTime, temp: $temp, feelsLike: $feelsLike, icon: $icon, text: $text, wind360: $wind360, windDir: $windDir, windScale: $windScale, windSpeed: $windSpeed, humidity: $humidity, precip: $precip, pressure: $pressure, vis: $vis, cloud: $cloud, dew: $dew)';
}
}
/// @nodoc
abstract mixin class $NowCopyWith<$Res> {
factory $NowCopyWith(Now value, $Res Function(Now) _then) = _$NowCopyWithImpl;
@useResult
$Res call({
String? obsTime, String? temp, String? feelsLike, String? icon, String? text, String? wind360, String? windDir, String? windScale, String? windSpeed, String? humidity, String? precip, String? pressure, String? vis, String? cloud, String? dew
});
}
/// @nodoc
class _$NowCopyWithImpl<$Res>
implements $NowCopyWith<$Res> {
_$NowCopyWithImpl(this._self, this._then);
final Now _self;
final $Res Function(Now) _then;
/// Create a copy of Now
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call(
{Object? obsTime = freezed, Object? temp = freezed, Object? feelsLike = freezed, Object? icon = freezed, Object? text = freezed, Object? wind360 = freezed, Object? windDir = freezed, Object? windScale = freezed, Object? windSpeed = freezed, Object? humidity = freezed, Object? precip = freezed, Object? pressure = freezed, Object? vis = freezed, Object? cloud = freezed, Object? dew = freezed,}) {
return _then(_self.copyWith(
obsTime: freezed == obsTime
? _self.obsTime
: obsTime // ignore: cast_nullable_to_non_nullable
as String?,
temp: freezed == temp
? _self.temp
: temp // ignore: cast_nullable_to_non_nullable
as String?,
feelsLike: freezed == feelsLike
? _self.feelsLike
: feelsLike // ignore: cast_nullable_to_non_nullable
as String?,
icon: freezed == icon
? _self.icon
: icon // ignore: cast_nullable_to_non_nullable
as String?,
text: freezed == text
? _self.text
: text // ignore: cast_nullable_to_non_nullable
as String?,
wind360: freezed == wind360
? _self.wind360
: wind360 // ignore: cast_nullable_to_non_nullable
as String?,
windDir: freezed == windDir
? _self.windDir
: windDir // ignore: cast_nullable_to_non_nullable
as String?,
windScale: freezed == windScale
? _self.windScale
: windScale // ignore: cast_nullable_to_non_nullable
as String?,
windSpeed: freezed == windSpeed
? _self.windSpeed
: windSpeed // ignore: cast_nullable_to_non_nullable
as String?,
humidity: freezed == humidity
? _self.humidity
: humidity // ignore: cast_nullable_to_non_nullable
as String?,
precip: freezed == precip
? _self.precip
: precip // ignore: cast_nullable_to_non_nullable
as String?,
pressure: freezed == pressure
? _self.pressure
: pressure // ignore: cast_nullable_to_non_nullable
as String?,
vis: freezed == vis
? _self.vis
: vis // ignore: cast_nullable_to_non_nullable
as String?,
cloud: freezed == cloud
? _self.cloud
: cloud // ignore: cast_nullable_to_non_nullable
as String?,
dew: freezed == dew
? _self.dew
: dew // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
/// @nodoc
@JsonSerializable()
class _Now implements Now {
const _Now(
{this.obsTime, this.temp, this.feelsLike, this.icon, this.text, this.wind360, this.windDir, this.windScale, this.windSpeed, this.humidity, this.precip, this.pressure, this.vis, this.cloud, this.dew});
factory _Now.fromJson(Map<String, dynamic> json) => _$NowFromJson(json);
@override final String? obsTime;
@override final String? temp;
@override final String? feelsLike;
@override final String? icon;
@override final String? text;
@override final String? wind360;
@override final String? windDir;
@override final String? windScale;
@override final String? windSpeed;
@override final String? humidity;
@override final String? precip;
@override final String? pressure;
@override final String? vis;
@override final String? cloud;
@override final String? dew;
/// Create a copy of Now
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$NowCopyWith<_Now> get copyWith =>
__$NowCopyWithImpl<_Now>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$NowToJson(this,);
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _Now &&
(identical(other.obsTime, obsTime) || other.obsTime == obsTime) &&
(identical(other.temp, temp) || other.temp == temp) &&
(identical(other.feelsLike, feelsLike) ||
other.feelsLike == feelsLike) &&
(identical(other.icon, icon) || other.icon == icon) &&
(identical(other.text, text) || other.text == text) &&
(identical(other.wind360, wind360) || other.wind360 == wind360) &&
(identical(other.windDir, windDir) || other.windDir == windDir) &&
(identical(other.windScale, windScale) ||
other.windScale == windScale) &&
(identical(other.windSpeed, windSpeed) ||
other.windSpeed == windSpeed) &&
(identical(other.humidity, humidity) ||
other.humidity == humidity) &&
(identical(other.precip, precip) || other.precip == precip) &&
(identical(other.pressure, pressure) ||
other.pressure == pressure) &&
(identical(other.vis, vis) || other.vis == vis) &&
(identical(other.cloud, cloud) || other.cloud == cloud) &&
(identical(other.dew, dew) || other.dew == dew));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode =>
Object.hash(
runtimeType,
obsTime,
temp,
feelsLike,
icon,
text,
wind360,
windDir,
windScale,
windSpeed,
humidity,
precip,
pressure,
vis,
cloud,
dew);
@override
String toString() {
return 'Now(obsTime: $obsTime, temp: $temp, feelsLike: $feelsLike, icon: $icon, text: $text, wind360: $wind360, windDir: $windDir, windScale: $windScale, windSpeed: $windSpeed, humidity: $humidity, precip: $precip, pressure: $pressure, vis: $vis, cloud: $cloud, dew: $dew)';
}
}
/// @nodoc
abstract mixin class _$NowCopyWith<$Res> implements $NowCopyWith<$Res> {
factory _$NowCopyWith(_Now value,
$Res Function(_Now) _then) = __$NowCopyWithImpl;
@override
@useResult
$Res call({
String? obsTime, String? temp, String? feelsLike, String? icon, String? text, String? wind360, String? windDir, String? windScale, String? windSpeed, String? humidity, String? precip, String? pressure, String? vis, String? cloud, String? dew
});
}
/// @nodoc
class __$NowCopyWithImpl<$Res>
implements _$NowCopyWith<$Res> {
__$NowCopyWithImpl(this._self, this._then);
final _Now _self;
final $Res Function(_Now) _then;
/// Create a copy of Now
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call(
{Object? obsTime = freezed, Object? temp = freezed, Object? feelsLike = freezed, Object? icon = freezed, Object? text = freezed, Object? wind360 = freezed, Object? windDir = freezed, Object? windScale = freezed, Object? windSpeed = freezed, Object? humidity = freezed, Object? precip = freezed, Object? pressure = freezed, Object? vis = freezed, Object? cloud = freezed, Object? dew = freezed,}) {
return _then(_Now(
obsTime: freezed == obsTime
? _self.obsTime
: obsTime // ignore: cast_nullable_to_non_nullable
as String?,
temp: freezed == temp
? _self.temp
: temp // ignore: cast_nullable_to_non_nullable
as String?,
feelsLike: freezed == feelsLike
? _self.feelsLike
: feelsLike // ignore: cast_nullable_to_non_nullable
as String?,
icon: freezed == icon
? _self.icon
: icon // ignore: cast_nullable_to_non_nullable
as String?,
text: freezed == text
? _self.text
: text // ignore: cast_nullable_to_non_nullable
as String?,
wind360: freezed == wind360
? _self.wind360
: wind360 // ignore: cast_nullable_to_non_nullable
as String?,
windDir: freezed == windDir
? _self.windDir
: windDir // ignore: cast_nullable_to_non_nullable
as String?,
windScale: freezed == windScale
? _self.windScale
: windScale // ignore: cast_nullable_to_non_nullable
as String?,
windSpeed: freezed == windSpeed
? _self.windSpeed
: windSpeed // ignore: cast_nullable_to_non_nullable
as String?,
humidity: freezed == humidity
? _self.humidity
: humidity // ignore: cast_nullable_to_non_nullable
as String?,
precip: freezed == precip
? _self.precip
: precip // ignore: cast_nullable_to_non_nullable
as String?,
pressure: freezed == pressure
? _self.pressure
: pressure // ignore: cast_nullable_to_non_nullable
as String?,
vis: freezed == vis
? _self.vis
: vis // ignore: cast_nullable_to_non_nullable
as String?,
cloud: freezed == cloud
? _self.cloud
: cloud // ignore: cast_nullable_to_non_nullable
as String?,
dew: freezed == dew
? _self.dew
: dew // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
// dart format on

View File

@@ -0,0 +1,79 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'weather.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_WeatherResponse _$WeatherResponseFromJson(Map<String, dynamic> json) =>
_WeatherResponse(
code: json['code'] as String?,
updateTime: json['updateTime'] as String?,
fxLink: json['fxLink'] as String?,
now:
json['now'] == null
? null
: Now.fromJson(json['now'] as Map<String, dynamic>),
refer:
json['refer'] == null
? null
: Refer.fromJson(json['refer'] as Map<String, dynamic>),
);
Map<String, dynamic> _$WeatherResponseToJson(_WeatherResponse instance) =>
<String, dynamic>{
if (instance.code case final value?) 'code': value,
if (instance.updateTime case final value?) 'updateTime': value,
if (instance.fxLink case final value?) 'fxLink': value,
if (instance.now case final value?) 'now': value,
if (instance.refer case final value?) 'refer': value,
};
_Refer _$ReferFromJson(Map<String, dynamic> json) => _Refer(
sources:
(json['sources'] as List<dynamic>?)?.map((e) => e as String).toList(),
license:
(json['license'] as List<dynamic>?)?.map((e) => e as String).toList(),
);
Map<String, dynamic> _$ReferToJson(_Refer instance) => <String, dynamic>{
if (instance.sources case final value?) 'sources': value,
if (instance.license case final value?) 'license': value,
};
_Now _$NowFromJson(Map<String, dynamic> json) => _Now(
obsTime: json['obsTime'] as String?,
temp: json['temp'] as String?,
feelsLike: json['feelsLike'] as String?,
icon: json['icon'] as String?,
text: json['text'] as String?,
wind360: json['wind360'] as String?,
windDir: json['windDir'] as String?,
windScale: json['windScale'] as String?,
windSpeed: json['windSpeed'] as String?,
humidity: json['humidity'] as String?,
precip: json['precip'] as String?,
pressure: json['pressure'] as String?,
vis: json['vis'] as String?,
cloud: json['cloud'] as String?,
dew: json['dew'] as String?,
);
Map<String, dynamic> _$NowToJson(_Now instance) => <String, dynamic>{
if (instance.obsTime case final value?) 'obsTime': value,
if (instance.temp case final value?) 'temp': value,
if (instance.feelsLike case final value?) 'feelsLike': value,
if (instance.icon case final value?) 'icon': value,
if (instance.text case final value?) 'text': value,
if (instance.wind360 case final value?) 'wind360': value,
if (instance.windDir case final value?) 'windDir': value,
if (instance.windScale case final value?) 'windScale': value,
if (instance.windSpeed case final value?) 'windSpeed': value,
if (instance.humidity case final value?) 'humidity': value,
if (instance.precip case final value?) 'precip': value,
if (instance.pressure case final value?) 'pressure': value,
if (instance.vis case final value?) 'vis': value,
if (instance.cloud case final value?) 'cloud': value,
if (instance.dew case final value?) 'dew': value,
};

View File

@@ -1,10 +1,13 @@
import 'package:flutter/cupertino.dart';
class AppBorderRadius {
static const BorderRadius smallBorderRadius =
BorderRadius.all(Radius.circular(8.0));
static const BorderRadius mediumBorderRadius =
BorderRadius.all(Radius.circular(12.0));
static const BorderRadius largeBorderRadius =
BorderRadius.all(Radius.circular(16.0));
static const BorderRadius smallBorderRadius = BorderRadius.all(
Radius.circular(8.0),
);
static const BorderRadius mediumBorderRadius = BorderRadius.all(
Radius.circular(12.0),
);
static const BorderRadius largeBorderRadius = BorderRadius.all(
Radius.circular(16.0),
);
}

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:moodiary/main.dart';
import 'package:moodiary/l10n/l10n.dart';
enum AppColorType {
common(0),
@@ -34,21 +34,33 @@ class AppColor {
// PANTONE 2008 Blue Iris
static Color answerColor = const Color(0xFF5A5B9F);
static String colorName(index) {
static String colorName(index, BuildContext context) {
return switch (index) {
0 => l10n.colorNameBaiCaoShuang,
1 => l10n.colorNameQunQin,
2 => l10n.colorNameQinDai,
3 => l10n.colorNameShuiZhuHua,
4 => l10n.colorNameJiHe,
5 => l10n.colorNameXiangYe,
9990 => l10n.specialColorNameMochaMousse,
_ => l10n.colorNameSystem
0 => context.l10n.colorNameBaiCaoShuang,
1 => context.l10n.colorNameQunQin,
2 => context.l10n.colorNameQinDai,
3 => context.l10n.colorNameShuiZhuHua,
4 => context.l10n.colorNameJiHe,
5 => context.l10n.colorNameXiangYe,
9990 => context.l10n.specialColorNameMochaMousse,
_ => context.l10n.colorNameSystem,
};
}
static List<Color> emoColorList = [
const Color(0xFFFA4659),
const Color(0xFF2EB872)
const Color(0xFF2EB872),
];
}
class ShareCardColor {
static List<Color> cardColorList = [
const Color(0xFFF8F3D4),
const Color(0xFFF5F5F5),
const Color(0xFFFFFFFF),
const Color(0xFF393e46),
const Color(0xFF252A34),
const Color(0xFF212121),
const Color(0xFF000000),
];
}

View File

@@ -419,6 +419,6 @@ class WeatherIcon {
"2425": const IconData(62147, fontFamily: 'qweather'),
"2426": const IconData(62148, fontFamily: 'qweather'),
"9998": const IconData(61898, fontFamily: 'qweather'),
"9999": const IconData(61899, fontFamily: 'qweather')
"9999": const IconData(61899, fontFamily: 'qweather'),
};
}

View File

@@ -1,4 +1,5 @@
import 'package:moodiary/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:moodiary/l10n/l10n.dart';
enum Language {
system('system'),
@@ -11,14 +12,14 @@ enum Language {
}
extension LanguageExtension on Language {
String get l10nText {
String l10nText(BuildContext context) {
switch (this) {
case Language.system:
return l10n.settingLanguageSystem;
return context.l10n.settingLanguageSystem;
case Language.chinese:
return l10n.settingLanguageSimpleChinese;
return context.l10n.settingLanguageSimpleChinese;
case Language.english:
return l10n.settingLanguageEnglish;
return context.l10n.settingLanguageEnglish;
}
}
}

View File

@@ -18,8 +18,4 @@ class WebDavOptions {
static const Color connectingColor = Color(0xFFFFC107);
}
enum WebDavConnectivityStatus {
connected,
unconnected,
connecting,
}
enum WebDavConnectivityStatus { connected, unconnected, connecting }

View File

@@ -1,12 +1,13 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/keyboard_state.dart';
import 'package:moodiary/components/keyboard_listener/keyboard_listener.dart';
import 'package:moodiary/utils/literunner.dart';
import 'package:moodiary/utils/tokenization.dart';
import 'package:refreshed/refreshed.dart';
import 'ask_question_state.dart';
class AskQuestionLogic extends GetxController with WidgetsBindingObserver {
class AskQuestionLogic extends GetxController {
final AskQuestionState state = AskQuestionState();
//输入框控制器
@@ -23,42 +24,31 @@ class AskQuestionLogic extends GetxController with WidgetsBindingObserver {
List<double> heightList = [];
late final KeyboardObserver keyboardObserver;
@override
void didChangeMetrics() {
WidgetsBinding.instance.addPostFrameCallback((_) {
final height = MediaQuery.viewInsetsOf(Get.context!).bottom;
if (heightList.isNotEmpty && height != heightList.last) {
if (height > heightList.last &&
state.keyboardState != KeyboardState.opening) {
state.keyboardState = KeyboardState.opening;
//正在打开
} else if (height < heightList.last &&
state.keyboardState != KeyboardState.closing) {
state.keyboardState = KeyboardState.closing;
//正在关闭
unFocus();
void onInit() {
keyboardObserver = KeyboardObserver(
onStateChanged: (state) {
switch (state) {
case KeyboardState.opening:
break;
case KeyboardState.closing:
unFocus();
break;
case KeyboardState.closed:
toBottom();
break;
case KeyboardState.unknown:
break;
}
}
// 只在高度变化时记录高度
if (heightList.isEmpty || height != heightList.last) {
heightList.add(height);
}
// 当高度为0且键盘经历了开启关闭过程时认为键盘已完全关闭
if (height == 0 && state.keyboardState != KeyboardState.closed) {
state.keyboardState = KeyboardState.closed;
heightList.clear();
toBottom();
//已经关闭
}
});
super.didChangeMetrics();
},
);
super.onInit();
}
@override
void onReady() async {
WidgetsBinding.instance.addObserver(this);
//await fullTokenizer.init();
//await liteRunner.initializeInterpreter(state.modelPath, fullTokenizer);
super.onReady();
@@ -66,11 +56,10 @@ class AskQuestionLogic extends GetxController with WidgetsBindingObserver {
@override
void onClose() {
WidgetsBinding.instance.removeObserver(this);
keyboardObserver.stop();
textEditingController.dispose();
scrollController.dispose();
focusNode.dispose();
// 销毁实例
liteRunner.close();
super.onClose();
}
@@ -98,8 +87,11 @@ class AskQuestionLogic extends GetxController with WidgetsBindingObserver {
}
Future<void> toBottom() async {
await scrollController.animateTo(scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 100), curve: Curves.linear);
await scrollController.animateTo(
scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 100),
curve: Curves.linear,
);
}
Future<void> ask(String content) async {

View File

@@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:moodiary/common/values/keyboard_state.dart';
import 'package:refreshed/refreshed.dart';
class AskQuestionState {
late String modelPath;

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/border.dart';
import 'package:refreshed/refreshed.dart';
import 'ask_question_logic.dart';
@@ -13,7 +13,7 @@ class AskQuestionComponent extends StatelessWidget {
Widget build(BuildContext context) {
final logic = Get.put(AskQuestionLogic());
final state = Bind.find<AskQuestionLogic>().state;
final colorScheme = Theme.of(context).colorScheme;
Widget buildInput() {
return Container(
padding: const EdgeInsets.all(8.0),
@@ -21,25 +21,28 @@ class AskQuestionComponent extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: TextField(
focusNode: logic.focusNode,
controller: logic.textEditingController,
maxLines: 1,
decoration: InputDecoration(
fillColor: colorScheme.surfaceContainerHighest,
child: TextField(
focusNode: logic.focusNode,
controller: logic.textEditingController,
maxLines: 1,
decoration: InputDecoration(
fillColor: context.theme.colorScheme.surfaceContainerHighest,
filled: true,
isDense: true,
hintText: '提问',
border: const OutlineInputBorder(
borderRadius: AppBorderRadius.largeBorderRadius,
borderSide: BorderSide.none,
)),
)),
),
),
),
),
IconButton.filled(
onPressed: () async {
await logic.ask(content);
},
icon: const Icon(Icons.arrow_upward))
onPressed: () async {
await logic.ask(content);
},
icon: const Icon(Icons.arrow_upward),
),
],
),
);
@@ -52,12 +55,14 @@ class AskQuestionComponent extends StatelessWidget {
ConstrainedBox(
constraints: BoxConstraints(maxWidth: constraint.maxWidth * 0.618),
child: Card.filled(
color: colorScheme.surfaceContainerHigh,
color: context.theme.colorScheme.surfaceContainerHigh,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
text,
style: TextStyle(color: colorScheme.onSecondaryContainer),
style: TextStyle(
color: context.theme.colorScheme.onSecondaryContainer,
),
),
),
),
@@ -72,12 +77,14 @@ class AskQuestionComponent extends StatelessWidget {
ConstrainedBox(
constraints: BoxConstraints(maxWidth: constraint.maxWidth * 0.618),
child: Card.filled(
color: colorScheme.primaryContainer,
color: context.theme.colorScheme.primaryContainer,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
text,
style: TextStyle(color: colorScheme.onPrimaryContainer),
style: TextStyle(
color: context.theme.colorScheme.onPrimaryContainer,
),
),
),
),
@@ -106,10 +113,12 @@ class AskQuestionComponent extends StatelessWidget {
builder: (_) {
return Column(
children: [
Expanded(child: Obx(() {
return buildChat(constraint);
})),
buildInput()
Expanded(
child: Obx(() {
return buildChat(constraint);
}),
),
buildInput(),
],
);
},

View File

@@ -1,7 +1,7 @@
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/animation.dart';
import 'package:get/get.dart';
import 'package:moodiary/pages/edit/edit_logic.dart';
import 'package:refreshed/refreshed.dart';
import 'audio_player_state.dart';
@@ -11,7 +11,9 @@ class AudioPlayerLogic extends GetxController
final AudioPlayer audioPlayer = AudioPlayer();
late final AnimationController animationController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 100));
vsync: this,
duration: const Duration(milliseconds: 100),
);
late final EditLogic editLogic = Bind.find<EditLogic>();
@override
@@ -67,7 +69,7 @@ class AudioPlayerLogic extends GetxController
Future<void> changeValue(value) async {
state.handleChange.value = true;
state.currentDuration.value = Duration(
milliseconds:
(state.totalDuration.value.inMilliseconds * value).toInt());
milliseconds: (state.totalDuration.value.inMilliseconds * value).toInt(),
);
}
}

View File

@@ -1,4 +1,4 @@
import 'package:refreshed/refreshed.dart';
import 'package:get/get.dart';
class AudioPlayerState {
late String audioPath;

View File

@@ -1,6 +1,6 @@
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';
import 'package:refreshed/refreshed.dart';
import 'package:get/get.dart';
import 'package:syncfusion_flutter_sliders/sliders.dart';
import 'audio_player_logic.dart';
@@ -71,7 +71,6 @@ class AudioPlayerComponent extends StatelessWidget {
final logic = Get.put(AudioPlayerLogic(), tag: path);
final state = Bind.find<AudioPlayerLogic>(tag: path).state;
final colorScheme = Theme.of(context).colorScheme;
return GetBuilder<AudioPlayerLogic>(
tag: path,
initState: (_) async {
@@ -80,7 +79,7 @@ class AudioPlayerComponent extends StatelessWidget {
assignId: true,
builder: (_) {
return Card.filled(
color: colorScheme.secondaryContainer,
color: context.theme.colorScheme.secondaryContainer,
margin: EdgeInsets.zero,
child: Padding(
padding: const EdgeInsets.all(8.0),
@@ -110,7 +109,8 @@ class AudioPlayerComponent extends StatelessWidget {
onChanged: (value) {
logic.changeValue(value);
},
inactiveColor: colorScheme.surfaceContainer,
inactiveColor:
context.theme.colorScheme.surfaceContainer,
overlayShape: NoOverlayShape(),
thumbShape: SmallThumbShape(),
);
@@ -127,7 +127,11 @@ class AudioPlayerComponent extends StatelessWidget {
.split('.')[0]
.padLeft(8, '0'),
style: TextStyle(
color: colorScheme.onSecondaryContainer,
color:
context
.theme
.colorScheme
.onSecondaryContainer,
),
);
}),
@@ -139,7 +143,7 @@ class AudioPlayerComponent extends StatelessWidget {
},
icon: AnimatedIcon(
icon: AnimatedIcons.play_pause,
color: colorScheme.onPrimary,
color: context.theme.colorScheme.onPrimary,
progress: logic.animationController,
),
),
@@ -150,7 +154,11 @@ class AudioPlayerComponent extends StatelessWidget {
.split('.')[0]
.padLeft(8, '0'),
style: TextStyle(
color: colorScheme.onSecondaryContainer,
color:
context
.theme
.colorScheme
.onSecondaryContainer,
),
);
}),

View File

@@ -1,16 +1,20 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:moodiary/main.dart';
import 'package:refreshed/refreshed.dart';
import 'package:get/get.dart';
import 'package:moodiary/l10n/l10n.dart';
class FrostedGlassButton extends StatelessWidget {
final Widget child;
final double size;
final Function()? onPressed;
const FrostedGlassButton(
{super.key, required this.child, required this.size, this.onPressed});
const FrostedGlassButton({
super.key,
required this.child,
required this.size,
this.onPressed,
});
@override
Widget build(BuildContext context) {
@@ -31,10 +35,8 @@ class FrostedGlassButton extends StatelessWidget {
}
class MultiFabLayoutDelegate extends MultiChildLayoutDelegate {
MultiFabLayoutDelegate({
required this.controller,
required this.layoutIds,
}) : super(relayout: controller);
MultiFabLayoutDelegate({required this.controller, required this.layoutIds})
: super(relayout: controller);
final Animation<double> controller;
final List<int> layoutIds;
@@ -55,8 +57,10 @@ class MultiFabLayoutDelegate extends MultiChildLayoutDelegate {
);
positionChild(
0,
Offset(size.width - mainButtonSize.width,
size.height - mainButtonSize.height),
Offset(
size.width - mainButtonSize.width,
size.height - mainButtonSize.height,
),
);
}
@@ -66,18 +70,17 @@ class MultiFabLayoutDelegate extends MultiChildLayoutDelegate {
if (hasChild(layoutId)) {
final childButtonSize = layoutChild(
layoutId,
BoxConstraints(
maxWidth: size.width,
maxHeight: childButtonHeight,
),
BoxConstraints(maxWidth: size.width, maxHeight: childButtonHeight),
);
// 动态计算子按钮的垂直偏移量
final dyOffset = (mainButtonHeight + buttonSpacing) +
final dyOffset =
(mainButtonHeight + buttonSpacing) +
(i - 1) * (childButtonSize.height + buttonSpacing) * animationValue;
// 动态计算水平偏移量,使子按钮完全隐藏在主按钮底部时的水平位置对齐
final dxOffset = (mainButtonHeight - childButtonSize.width) /
final dxOffset =
(mainButtonHeight - childButtonSize.width) /
2 *
(1 - animationValue);
@@ -102,20 +105,18 @@ class MultiFabLayoutDelegate extends MultiChildLayoutDelegate {
class PageBackButton extends StatelessWidget {
final Function()? onBack;
const PageBackButton({
super.key,
this.onBack,
});
final Color? color;
const PageBackButton({super.key, this.onBack, this.color});
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return Center(
child: IconButton(
onPressed: onBack ?? Get.back,
icon: const Icon(Icons.arrow_back_rounded),
color: colorScheme.onSurface,
tooltip: l10n.back,
color: color ?? context.theme.colorScheme.onSurface,
tooltip: context.l10n.back,
),
);
}

View File

@@ -0,0 +1,185 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
Color debugPaintExpandAreaColor = const Color(
0xFFFF0000,
).withValues(alpha: 0.03);
Color debugPaintClipAreaColor = const Color(0xFF0000FF).withValues(alpha: 0.02);
class ExpandTapWidget extends SingleChildRenderObjectWidget {
const ExpandTapWidget({
super.key,
super.child,
required this.onTap,
required this.tapPadding,
});
final VoidCallback onTap;
final EdgeInsets tapPadding;
@override
RenderObject createRenderObject(BuildContext context) =>
_ExpandTapRenderBox(onTap: onTap, tapPadding: tapPadding);
@override
void updateRenderObject(BuildContext context, RenderBox renderObject) {
renderObject as _ExpandTapRenderBox;
if (renderObject.tapPadding != tapPadding) {
renderObject.tapPadding = tapPadding;
}
if (renderObject.onTap != onTap) {
renderObject.onTap = onTap;
}
}
}
class _TmpGestureArenaMember extends GestureArenaMember {
_TmpGestureArenaMember({required this.onTap});
final VoidCallback onTap;
@override
void acceptGesture(int key) {
onTap();
}
@override
void rejectGesture(int key) {}
}
class _ExpandTapRenderBox extends RenderBox
with RenderObjectWithChildMixin<RenderBox> {
_ExpandTapRenderBox({
required VoidCallback onTap,
required EdgeInsets tapPadding,
}) : _onTap = onTap,
_tapPadding = tapPadding;
VoidCallback _onTap;
EdgeInsets _tapPadding;
set onTap(VoidCallback value) {
if (_onTap != value) {
_onTap = value;
}
}
set tapPadding(EdgeInsets value) {
if (_tapPadding == value) return;
_tapPadding = value;
markNeedsPaint();
}
EdgeInsets get tapPadding => _tapPadding;
VoidCallback get onTap => _onTap;
@override
void performLayout() {
child!.layout(constraints, parentUsesSize: true);
size = child!.size;
if (size.isEmpty) {
_tapPadding = EdgeInsets.zero;
}
}
@override
void paint(PaintingContext context, Offset offset) {
if (child != null) {
final BoxParentData childParentData = child!.parentData! as BoxParentData;
context.paintChild(child!, childParentData.offset + offset);
}
assert(() {
debugPaintExpandArea(context, offset);
return true;
}());
}
void debugPaintExpandArea(PaintingContext context, Offset offset) {
if (size.isEmpty) return;
final RenderBox parentBox = parent as RenderBox;
Offset parentPosition = Offset.zero;
parentPosition = offset - localToGlobal(Offset.zero, ancestor: parentBox);
final Size parentSize = parentBox.size;
final Rect parentRect = Rect.fromLTWH(
parentPosition.dx,
parentPosition.dy,
parentSize.width,
parentSize.height,
);
final BoxParentData childParentData = child!.parentData! as BoxParentData;
final Offset paintOffset =
childParentData.offset + offset - tapPadding.topLeft;
final Rect paintRect = Rect.fromLTWH(
paintOffset.dx,
paintOffset.dy,
size.width + tapPadding.horizontal,
size.height + tapPadding.vertical,
);
final Paint paint =
Paint()
..style = PaintingStyle.fill
..strokeWidth = 1.0
..color = debugPaintExpandAreaColor;
final Paint paint2 =
Paint()
..style = PaintingStyle.fill
..strokeWidth = 1.0
..color = debugPaintClipAreaColor;
context.canvas.drawRect(paintRect, paint);
context.canvas.drawRect(paintRect.intersect(parentRect), paint2);
}
@override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event is PointerDownEvent) {
final _TmpGestureArenaMember member = _TmpGestureArenaMember(
onTap: onTap,
);
GestureBinding.instance.gestureArena.add(event.pointer, member);
} else if (event is PointerUpEvent) {
GestureBinding.instance.gestureArena.sweep(event.pointer);
}
}
@override
bool hitTestSelf(Offset position) => true;
@override
bool hitTestChildren(BoxHitTestResult result, {Offset? position}) {
visitChildren((child) {
if (child is RenderBox) {
final BoxParentData parentData = child.parentData! as BoxParentData;
if (child.hitTest(result, position: position! - parentData.offset)) {
return;
}
}
});
return false;
}
@override
bool hitTest(BoxHitTestResult result, {Offset? position}) {
final Rect expandRect = Rect.fromLTWH(
0 - tapPadding.left,
0 - tapPadding.top,
size.width + tapPadding.right + tapPadding.left,
size.height + tapPadding.top + tapPadding.bottom,
);
if (expandRect.contains(position!)) {
final bool hitTarget =
hitTestChildren(result, position: position) || hitTestSelf(position);
if (hitTarget) {
result.add(BoxHitTestEntry(this, position));
return true;
}
}
return false;
}
}

View File

@@ -1,69 +1,321 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:moodiary/utils/media_util.dart';
import 'package:get/get.dart';
import 'package:moodiary/utils/cache_util.dart';
class ThumbnailImage extends StatelessWidget {
final kTransparentImage = Uint8List.fromList(<int>[
0x89,
0x50,
0x4E,
0x47,
0x0D,
0x0A,
0x1A,
0x0A,
0x00,
0x00,
0x00,
0x0D,
0x49,
0x48,
0x44,
0x52,
0x00,
0x00,
0x00,
0x01,
0x00,
0x00,
0x00,
0x01,
0x08,
0x06,
0x00,
0x00,
0x00,
0x1F,
0x15,
0xC4,
0x89,
0x00,
0x00,
0x00,
0x0A,
0x49,
0x44,
0x41,
0x54,
0x78,
0x9C,
0x63,
0x00,
0x01,
0x00,
0x00,
0x05,
0x00,
0x01,
0x0D,
0x0A,
0x2D,
0xB4,
0x00,
0x00,
0x00,
0x00,
0x49,
0x45,
0x4E,
0x44,
0xAE,
0x42,
0x60,
0x82,
]);
enum _ImageLoadState { loading, error, success }
class _ImageState {
final int width;
final int height;
final String path;
final double aspectRatio;
_ImageState({
required this.width,
required this.height,
required this.path,
required this.aspectRatio,
});
}
class MoodiaryImage extends StatefulWidget {
final String imagePath;
final int size;
final BoxFit? fit;
final VoidCallback? onTap;
final String? heroTag;
final BorderRadius? borderRadius;
final bool showBorder;
final EdgeInsets? padding;
final String heroTag;
const ThumbnailImage({
const MoodiaryImage({
super.key,
required this.imagePath,
required this.size,
this.fit,
this.onTap,
required this.heroTag,
this.heroTag,
this.borderRadius,
this.showBorder = false,
this.padding,
});
Widget _buildImage({
required double aspectRatio,
required ImageProvider imageProvider,
required double pixelRatio,
}) {
final image = Image(
key: ValueKey(imagePath),
image: ResizeImage(
imageProvider,
width: aspectRatio < 1.0 ? (size * pixelRatio).toInt() : null,
height: aspectRatio >= 1.0 ? (size * pixelRatio).toInt() : null,
@override
State<MoodiaryImage> createState() => _MoodiaryImageState();
}
class _MoodiaryImageState extends State<MoodiaryImage> {
final Rx<_ImageLoadState> _loadState = Rx<_ImageLoadState>(
_ImageLoadState.loading,
);
late _ImageState _imageState;
@override
void initState() {
super.initState();
_loadImage();
}
@override
void dispose() {
_loadState.close();
super.dispose();
}
@override
void didUpdateWidget(covariant MoodiaryImage oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.imagePath != oldWidget.imagePath ||
widget.size != oldWidget.size) {
_loadImage();
}
}
void _loadImage() async {
_loadState.value = _ImageLoadState.loading;
try {
//logger.d('Image loaded from path: ${widget.imagePath}');
final imageAspect = await ImageCacheUtil().getImageAspectRatioWithCache(
imagePath: widget.imagePath,
);
final imageSize = widget.size;
final width =
imageAspect < 1.0 ? imageSize : (imageSize * imageAspect).ceil();
final height =
imageAspect >= 1.0 ? imageSize : (imageSize / imageAspect).ceil();
final path = await ImageCacheUtil().getLocalImagePathWithCache(
imagePath: widget.imagePath,
imageWidth: width * 2,
imageHeight: height * 2,
imageAspectRatio: imageAspect,
);
_imageState = _ImageState(
width: width,
height: height,
path: path,
aspectRatio: imageAspect,
);
_loadState.value = _ImageLoadState.success;
} catch (e) {
_loadState.value = _ImageLoadState.error;
}
}
BorderRadius _shrinkBorderRadius(BorderRadius radius, double amount) {
return BorderRadius.only(
topLeft: Radius.elliptical(
(radius.topLeft.x - amount).clamp(0, double.infinity),
(radius.topLeft.y - amount).clamp(0, double.infinity),
),
topRight: Radius.elliptical(
(radius.topRight.x - amount).clamp(0, double.infinity),
(radius.topRight.y - amount).clamp(0, double.infinity),
),
bottomLeft: Radius.elliptical(
(radius.bottomLeft.x - amount).clamp(0, double.infinity),
(radius.bottomLeft.y - amount).clamp(0, double.infinity),
),
bottomRight: Radius.elliptical(
(radius.bottomRight.x - amount).clamp(0, double.infinity),
(radius.bottomRight.y - amount).clamp(0, double.infinity),
),
fit: fit ?? BoxFit.cover,
);
return GestureDetector(
onTap: onTap,
child: Hero(tag: heroTag, child: image),
);
}
@override
Widget build(BuildContext context) {
final fileImage = FileImage(File(imagePath));
final devicePixelRatio = MediaQuery.devicePixelRatioOf(context);
final colorScheme = Theme.of(context).colorScheme;
final Future getAspectRatio = MediaUtil.getImageAspectRatio(fileImage);
final loading = ColoredBox(
color: colorScheme.surfaceContainer,
child: const Center(child: Icon(Icons.image_search_rounded)),
);
return FutureBuilder(
future: getAspectRatio,
builder: (context, snapshot) {
return switch (snapshot.connectionState) {
ConnectionState.none => loading,
ConnectionState.waiting => loading,
ConnectionState.active => loading,
ConnectionState.done => _buildImage(
aspectRatio: snapshot.data as double,
imageProvider: fileImage,
pixelRatio: devicePixelRatio,
),
};
},
const borderWidth = 1.0;
final outerRadius = widget.borderRadius ?? BorderRadius.zero;
final innerRadius =
widget.showBorder
? _shrinkBorderRadius(outerRadius, borderWidth)
: outerRadius;
return Container(
decoration: BoxDecoration(
borderRadius: outerRadius,
border:
widget.showBorder
? Border.all(
color: context.theme.colorScheme.outline.withValues(
alpha: 0.6,
),
width: borderWidth,
)
: null,
),
margin: widget.padding,
child: ClipRRect(
borderRadius: innerRadius,
child: AnimatedSwitcher(
duration: Durations.short3,
switchInCurve: Curves.easeOut,
switchOutCurve: Curves.easeIn,
child: Obx(() {
switch (_loadState.value) {
case _ImageLoadState.loading:
return const _LoadingPlaceholder(key: ValueKey('loading'));
case _ImageLoadState.error:
return const _ErrorPlaceholder(key: ValueKey('error'));
case _ImageLoadState.success:
final imagePath = _imageState.path;
final width = _imageState.width;
final height = _imageState.height;
return GestureDetector(
key: const ValueKey('image'),
onTap:
widget.onTap != null
? () async {
if (widget.heroTag != null) {
await precacheImage(
FileImage(File(widget.imagePath)),
context,
);
}
widget.onTap?.call();
}
: null,
behavior: HitTestBehavior.translucent,
child: HeroMode(
enabled: widget.heroTag != null,
child: Hero(
tag: widget.heroTag ?? '',
child: FadeInImage(
key: ValueKey(imagePath),
image: FileImage(File(imagePath)),
placeholder: MemoryImage(kTransparentImage),
fadeInDuration: Durations.short2,
fadeOutDuration: Durations.short1,
fit: widget.fit ?? BoxFit.cover,
width: width.toDouble(),
height: height.toDouble(),
imageErrorBuilder: (_, __, ___) {
return const _ErrorPlaceholder(
key: ValueKey('image_error'),
);
},
),
),
),
);
}
}),
),
),
);
}
}
class _ErrorPlaceholder extends StatelessWidget {
const _ErrorPlaceholder({super.key});
@override
Widget build(BuildContext context) {
return ColoredBox(
color: context.theme.colorScheme.errorContainer,
child: Center(
child: Icon(
Icons.error_rounded,
color: context.theme.colorScheme.onErrorContainer,
),
),
);
}
}
class _LoadingPlaceholder extends StatelessWidget {
const _LoadingPlaceholder({super.key});
@override
Widget build(BuildContext context) {
return ColoredBox(
color: context.theme.colorScheme.surfaceContainer,
child: Center(
child: Icon(
Icons.image_search_rounded,
color: context.theme.colorScheme.onSurfaceVariant,
),
),
);
}
}

View File

@@ -0,0 +1,64 @@
import 'dart:math';
import 'package:flutter/material.dart';
class MoodiaryLoading extends StatelessWidget {
const MoodiaryLoading({super.key, this.size = 24, this.color});
final double size;
final Color? color;
@override
Widget build(BuildContext context) {
return Center(child: CircularProgressIndicator(color: color));
}
}
class MoodiarySyncing extends StatefulWidget {
const MoodiarySyncing({super.key});
@override
State<MoodiarySyncing> createState() => _MoodiarySyncingState();
}
class _MoodiarySyncingState extends State<MoodiarySyncing>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 2),
)..repeat();
_animation = CurvedAnimation(
parent: _controller,
curve: Curves.elasticInOut,
);
}
@override
Widget build(BuildContext context) {
return Center(
child: AnimatedBuilder(
animation: _animation,
builder: (context, child) {
return Transform.rotate(
angle: _animation.value * 2 * pi,
child: child,
);
},
child: const Icon(Icons.sync_rounded),
),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}

View File

@@ -61,40 +61,40 @@ class Marquee extends StatefulWidget {
this.decelerationDuration = Duration.zero,
Curve decelerationCurve = Curves.decelerate,
this.onDone,
}) : assert(!blankSpace.isNaN),
assert(blankSpace >= 0, "The blankSpace needs to be positive or zero."),
assert(blankSpace.isFinite),
assert(!velocity.isNaN),
assert(velocity != 0.0, "The velocity cannot be zero."),
assert(velocity.isFinite),
assert(
pauseAfterRound >= Duration.zero,
"The pauseAfterRound cannot be negative as time travel isn't "
"invented yet.",
),
assert(
fadingEdgeStartFraction >= 0 && fadingEdgeStartFraction <= 1,
"The fadingEdgeGradientFractionOnStart value should be between 0 and "
"1, inclusive",
),
assert(
fadingEdgeEndFraction >= 0 && fadingEdgeEndFraction <= 1,
"The fadingEdgeGradientFractionOnEnd value should be between 0 and "
"1, inclusive",
),
assert(numberOfRounds == null || numberOfRounds > 0),
assert(
accelerationDuration >= Duration.zero,
"The accelerationDuration cannot be negative as time travel isn't "
"invented yet.",
),
assert(
decelerationDuration >= Duration.zero,
"The decelerationDuration must be positive or zero as time travel "
"isn't invented yet.",
),
accelerationCurve = IntegralCurve(accelerationCurve),
decelerationCurve = IntegralCurve(decelerationCurve);
}) : assert(!blankSpace.isNaN),
assert(blankSpace >= 0, "The blankSpace needs to be positive or zero."),
assert(blankSpace.isFinite),
assert(!velocity.isNaN),
assert(velocity != 0.0, "The velocity cannot be zero."),
assert(velocity.isFinite),
assert(
pauseAfterRound >= Duration.zero,
"The pauseAfterRound cannot be negative as time travel isn't "
"invented yet.",
),
assert(
fadingEdgeStartFraction >= 0 && fadingEdgeStartFraction <= 1,
"The fadingEdgeGradientFractionOnStart value should be between 0 and "
"1, inclusive",
),
assert(
fadingEdgeEndFraction >= 0 && fadingEdgeEndFraction <= 1,
"The fadingEdgeGradientFractionOnEnd value should be between 0 and "
"1, inclusive",
),
assert(numberOfRounds == null || numberOfRounds > 0),
assert(
accelerationDuration >= Duration.zero,
"The accelerationDuration cannot be negative as time travel isn't "
"invented yet.",
),
assert(
decelerationDuration >= Duration.zero,
"The decelerationDuration must be positive or zero as time travel "
"isn't invented yet.",
),
accelerationCurve = IntegralCurve(accelerationCurve),
decelerationCurve = IntegralCurve(decelerationCurve);
final String text;
final TextStyle? style;
final TextScaler? textScaler;
@@ -137,9 +137,10 @@ class _MarqueeState extends State<Marquee> with SingleTickerProviderStateMixin {
bool _running = false;
int _roundCounter = 0;
bool get isDone => widget.numberOfRounds == null
? false
: widget.numberOfRounds == _roundCounter;
bool get isDone =>
widget.numberOfRounds == null
? false
: widget.numberOfRounds == _roundCounter;
@override
void initState() {
@@ -178,24 +179,27 @@ class _MarqueeState extends State<Marquee> with SingleTickerProviderStateMixin {
void _initialize(BuildContext context) {
final totalLength = _getTextWidth(context) + widget.blankSpace;
final accelerationLength = widget.accelerationCurve.integral *
final accelerationLength =
widget.accelerationCurve.integral *
widget.velocity *
_accelerationDuration.inMilliseconds /
1000.0;
final decelerationLength = widget.decelerationCurve.integral *
final decelerationLength =
widget.decelerationCurve.integral *
widget.velocity *
_decelerationDuration.inMilliseconds /
1000.0;
final linearLength =
(totalLength - accelerationLength.abs() - decelerationLength.abs()) *
(widget.velocity > 0 ? 1 : -1);
(widget.velocity > 0 ? 1 : -1);
_startPosition = 2 * totalLength - widget.startPadding;
_accelerationTarget = _startPosition + accelerationLength;
_linearTarget = _accelerationTarget + linearLength;
_decelerationTarget = _linearTarget + decelerationLength;
_totalDuration = _accelerationDuration +
_totalDuration =
_accelerationDuration +
_decelerationDuration +
Duration(milliseconds: (linearLength / widget.velocity * 1000).toInt());
_linearDuration =
@@ -259,10 +263,12 @@ class _MarqueeState extends State<Marquee> with SingleTickerProviderStateMixin {
final richTextWidget = Text.rich(span).build(context) as RichText;
final renderObject = richTextWidget.createRenderObject(context);
renderObject.layout(constraints);
final boxes = renderObject.getBoxesForSelection(TextSelection(
baseOffset: 0,
extentOffset: TextSpan(text: widget.text).toPlainText().length,
));
final boxes = renderObject.getBoxesForSelection(
TextSelection(
baseOffset: 0,
extentOffset: TextSpan(text: widget.text).toPlainText().length,
),
);
return boxes.last.right;
}
@@ -277,18 +283,18 @@ class _MarqueeState extends State<Marquee> with SingleTickerProviderStateMixin {
itemBuilder: (_, i) {
return i.isEven
? Text(
widget.text,
style: widget.style,
textScaler: widget.textScaler,
)
widget.text,
style: widget.style,
textScaler: widget.textScaler,
)
: SizedBox(
width: widget.scrollAxis == Axis.horizontal
? widget.blankSpace
: null,
height: widget.scrollAxis == Axis.vertical
? widget.blankSpace
: null,
);
width:
widget.scrollAxis == Axis.horizontal
? widget.blankSpace
: null,
height:
widget.scrollAxis == Axis.vertical ? widget.blankSpace : null,
);
},
);
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class Modal extends StatelessWidget {
final Animation<double> animation;
@@ -8,15 +9,15 @@ class Modal extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return AnimatedBuilder(
animation: animation,
builder: (context, child) {
return Visibility(
visible: animation.value > 0,
child: ModalBarrier(
color: colorScheme.surfaceContainer
.withValues(alpha: 0.6 * animation.value),
color: context.theme.colorScheme.surfaceContainer.withValues(
alpha: 0.6 * animation.value,
),
barrierSemanticsDismissible: false,
onDismiss: onTap,
),

View File

@@ -0,0 +1,64 @@
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/border.dart';
class _TrianglePainter extends CustomPainter {
final Color color;
final Size size;
_TrianglePainter({required this.color, required this.size});
@override
void paint(Canvas canvas, Size size) {
final paint =
Paint()
..color = color
..style = PaintingStyle.fill;
final path =
Path()
..moveTo(0, size.height)
..lineTo(size.width, size.height)
..lineTo(size.width / 2, 0)
..close();
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(covariant _TrianglePainter oldDelegate) => false;
}
void showPopupWidget({
required BuildContext targetContext,
required Widget child,
}) {
SmartDialog.showAttach(
targetContext: targetContext,
maskColor: Colors.transparent,
builder: (context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
CustomPaint(
size: const Size(12, 6),
painter: _TrianglePainter(
color: context.theme.colorScheme.surfaceContainer,
size: const Size(12, 6),
),
),
Container(
padding: const EdgeInsets.all(6.0),
decoration: BoxDecoration(
color: context.theme.colorScheme.surfaceContainer,
borderRadius: AppBorderRadius.mediumBorderRadius,
),
child: child,
),
],
);
},
);
}

View File

@@ -0,0 +1,134 @@
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/utils/aes_util.dart';
import 'package:qr_flutter/qr_flutter.dart';
class EncryptQrCode extends StatefulWidget {
final String data;
final double size;
final Duration validDuration;
final String? prefix;
const EncryptQrCode({
super.key,
required this.data,
this.size = 64,
this.validDuration = const Duration(minutes: 2),
this.prefix,
});
@override
State<EncryptQrCode> createState() => _EncryptQrCodeState();
}
class _EncryptQrCodeState extends State<EncryptQrCode> {
Uint8List? encryptedData;
late int expireAt; // Unix 时间戳
bool isExpired = false;
@override
void initState() {
super.initState();
_encryptData();
}
Future<void> _encryptData() async {
final now = DateTime.now().millisecondsSinceEpoch ~/ 1000;
expireAt = now + widget.validDuration.inSeconds;
final aesData = await AesUtil.encryptWithTimeWindow(
data: '${widget.prefix}${widget.data}',
validDuration: widget.validDuration,
);
setState(() {
isExpired = false;
encryptedData = aesData;
});
_startExpirationChecker();
}
void _startExpirationChecker() {
Timer.periodic(const Duration(seconds: 1), (timer) {
final now = DateTime.now().millisecondsSinceEpoch ~/ 1000;
if (now >= expireAt) {
setState(() {
isExpired = true;
});
timer.cancel();
}
});
}
Widget _buildQrChild() {
if (encryptedData == null) {
return Center(
key: const ValueKey('loading'),
child: CircularProgressIndicator(
color: context.theme.colorScheme.onSurfaceVariant,
),
);
}
if (isExpired) {
return GestureDetector(
key: const ValueKey('expired'),
onTap: _encryptData,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.error_rounded,
color: context.theme.colorScheme.onSurfaceVariant,
),
const SizedBox(height: 8),
Text(
'已过期',
style: context.textTheme.labelMedium?.copyWith(
color: context.theme.colorScheme.onSurfaceVariant,
),
),
],
),
),
);
}
return QrImageView(
key: const ValueKey('qr'),
data: base64Encode(encryptedData!),
size: widget.size,
backgroundColor: Colors.transparent,
dataModuleStyle: QrDataModuleStyle(
color: context.theme.colorScheme.onSurface,
dataModuleShape: QrDataModuleShape.circle,
),
eyeStyle: QrEyeStyle(
color: context.theme.colorScheme.onSurface,
eyeShape: QrEyeShape.circle,
),
gapless: false,
padding: EdgeInsets.zero,
);
}
@override
Widget build(BuildContext context) {
return SizedBox(
width: widget.size,
height: widget.size,
child: AnimatedSwitcher(
duration: Durations.medium2,
switchInCurve: Curves.easeIn,
switchOutCurve: Curves.easeOut,
child: _buildQrChild(),
),
);
}
}

View File

@@ -0,0 +1,334 @@
import 'dart:async';
import 'dart:convert';
import 'package:dartx/dartx.dart';
import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'package:moodiary/router/app_pages.dart';
import 'package:moodiary/utils/aes_util.dart';
import 'package:moodiary/utils/log_util.dart';
import 'package:moodiary/utils/notice_util.dart';
import 'package:throttling/throttling.dart';
Future<String?> showQrScanner({
required BuildContext context,
Duration? validDuration,
String? prefix,
}) async {
return Navigator.push<String?>(
context,
MoodiaryFadeInPageRoute(
builder: (context) {
return QrScanner(validDuration: validDuration, prefix: prefix);
},
),
);
}
class QrScanner extends StatefulWidget {
final Duration? validDuration;
final String? prefix;
const QrScanner({super.key, this.validDuration, this.prefix});
@override
State<QrScanner> createState() => _QrScannerState();
}
class _QrScannerState extends State<QrScanner>
with SingleTickerProviderStateMixin {
late final AnimationController _animationController = AnimationController(
vsync: this,
duration: Durations.long4,
)..repeat(reverse: true);
late final Animation<double> _curvedAnimation = CurvedAnimation(
parent: _animationController,
curve: Curves.easeInOut,
);
late final MobileScannerController _scannerController =
MobileScannerController(
invertImage: true,
autoStart: false,
cameraResolution: const Size.square(640),
formats: [BarcodeFormat.qrCode],
);
late final Throttling _throttling = Throttling();
late final AppLifecycleListener _appLifecycleListener;
StreamSubscription<Object?>? _subscription;
late final ValueNotifier<TorchState> _torchState = ValueNotifier(
TorchState.unavailable,
);
@override
void initState() {
_subscription = _scannerController.barcodes.listen(_handleBarcode);
_appLifecycleListener = AppLifecycleListener(
onStateChange: (state) {
if (!_scannerController.value.hasCameraPermission) {
return;
}
switch (state) {
case AppLifecycleState.detached:
case AppLifecycleState.hidden:
case AppLifecycleState.paused:
return;
case AppLifecycleState.resumed:
_subscription = _scannerController.barcodes.listen(_handleBarcode);
unawaited(_scannerController.start());
case AppLifecycleState.inactive:
unawaited(_subscription?.cancel());
_subscription = null;
unawaited(_scannerController.stop());
}
},
);
_scannerController.addListener(() {
if (_scannerController.value.torchState != _torchState.value) {
_torchState.value = _scannerController.value.torchState;
}
});
unawaited(_scannerController.start());
super.initState();
}
@override
void dispose() async {
unawaited(_subscription?.cancel());
_subscription = null;
_animationController.dispose();
_throttling.close();
_appLifecycleListener.dispose();
super.dispose();
await _scannerController.dispose();
}
void _handleBarcode(BarcodeCapture value) {
_throttling.throttle(() async {
final raw = value.barcodes.firstOrNull?.rawValue;
if (raw == null) return;
try {
if (widget.validDuration != null) {
final resBytes = base64Decode(raw);
final decrypted = await AesUtil.decryptWithTimeWindow(
encryptedData: resBytes,
validDuration: widget.validDuration!,
);
if (decrypted.isNullOrBlank) {
_handleInvalidQr();
return;
}
if (widget.prefix.isNotNullOrBlank) {
if (!decrypted!.startsWith(widget.prefix!)) {
_handleInvalidQr();
return;
}
final realData = decrypted.substring(widget.prefix!.length);
if (mounted) Navigator.pop(context, realData);
} else {
if (mounted) Navigator.pop(context, decrypted);
}
} else {
if (raw.isNullOrBlank) {
_handleInvalidQr();
} else {
if (mounted) Navigator.pop(context, raw);
}
}
} catch (e) {
logger.d(e);
_handleInvalidQr();
}
});
}
void _handleInvalidQr() {
if (mounted) {
toast.info(message: context.l10n.qrCodeInvalid);
}
}
@override
Widget build(BuildContext context) {
final scanWindow = Rect.fromCenter(
center: MediaQuery.sizeOf(context).center(Offset.zero),
width: 200,
height: 200,
);
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
leading: BackButton(
color: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
),
extendBodyBehindAppBar: true,
body: Stack(
alignment: Alignment.center,
children: [
MobileScanner(
scanWindow: scanWindow,
controller: _scannerController,
overlayBuilder: (context, constraints) {
return AnimatedBuilder(
animation: _curvedAnimation,
builder: (context, child) {
return Stack(
children: [
CustomPaint(
size: constraints.biggest,
painter: _ScannerOverlayPainter(
centerSize: _curvedAnimation.value * 20 + 200,
),
),
Center(
child: CustomPaint(
size: Size.square(_curvedAnimation.value * 20 + 200),
painter: _CornerBorderPainter(
color: Colors.white,
strokeWidth: 4,
cornerLength: _curvedAnimation.value * 2 + 20,
radius: 12,
),
),
),
],
);
},
);
},
),
Positioned(
bottom: MediaQuery.sizeOf(context).height / 2 - 300,
child: ValueListenableBuilder(
valueListenable: _torchState,
builder: (context, value, child) {
if (value == TorchState.unavailable) {
return const SizedBox.shrink();
}
return IconButton(
onPressed: () async {
await _scannerController.toggleTorch();
},
iconSize: 56,
icon: switch (_torchState.value) {
TorchState.auto => const Icon(
Icons.flash_auto_rounded,
color: Colors.white,
),
TorchState.off => const Icon(
Icons.flashlight_off_rounded,
color: Colors.white54,
),
TorchState.on => const Icon(
Icons.flashlight_on_rounded,
color: Colors.white,
),
TorchState.unavailable => throw UnimplementedError(),
},
);
},
),
),
],
),
);
}
}
class _CornerBorderPainter extends CustomPainter {
final Color color;
final double strokeWidth;
final double cornerLength;
final double radius;
_CornerBorderPainter({
required this.color,
this.strokeWidth = 2,
this.cornerLength = 20,
this.radius = 0,
});
@override
void paint(Canvas canvas, Size size) {
final paint =
Paint()
..color = color
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke
..strokeCap = StrokeCap.round;
final path = Path();
final double w = size.width;
final double h = size.height;
final r = radius;
path.moveTo(0, r + cornerLength);
path.lineTo(0, r);
path.quadraticBezierTo(0, 0, r, 0);
path.lineTo(r + cornerLength, 0);
path.moveTo(w - r - cornerLength, 0);
path.lineTo(w - r, 0);
path.quadraticBezierTo(w, 0, w, r);
path.lineTo(w, r + cornerLength);
path.moveTo(w, h - r - cornerLength);
path.lineTo(w, h - r);
path.quadraticBezierTo(w, h, w - r, h);
path.lineTo(w - r - cornerLength, h);
path.moveTo(r + cornerLength, h);
path.lineTo(r, h);
path.quadraticBezierTo(0, h, 0, h - r);
path.lineTo(0, h - r - cornerLength);
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}
class _ScannerOverlayPainter extends CustomPainter {
final double centerSize;
_ScannerOverlayPainter({required this.centerSize});
@override
void paint(Canvas canvas, Size size) {
final paint =
Paint()
..color = Colors.black54
..style = PaintingStyle.fill;
final outer = Path()..addRect(Rect.fromLTWH(0, 0, size.width, size.height));
final scanSize = centerSize;
final left = (size.width - scanSize) / 2;
final top = (size.height - scanSize) / 2;
final scanRect = Rect.fromLTWH(left, top, scanSize, scanSize);
final hole = Path()..addRRect(RRect.fromRectXY(scanRect, 12, 12));
final overlay = Path.combine(PathOperation.difference, outer, hole);
canvas.drawPath(overlay, paint);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}

View File

@@ -1,6 +1,7 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
import 'package:moodiary/common/values/border.dart';
@@ -8,26 +9,32 @@ class FloatingModal extends StatelessWidget {
final Widget child;
final bool isScrollControlled;
const FloatingModal(
{super.key, required this.child, required this.isScrollControlled});
const FloatingModal({
super.key,
required this.child,
required this.isScrollControlled,
});
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final padding = MediaQuery.viewPaddingOf(context);
final padding = MediaQuery.viewInsetsOf(context);
final size = MediaQuery.sizeOf(context);
final maxHeight = isScrollControlled
? size.height - (padding.top - padding.bottom)
: size.height * 9.0 / 16.0;
final maxHeight =
isScrollControlled
? size.height - (padding.top - padding.bottom)
: size.height * 9.0 / 16.0;
return Align(
alignment: Alignment.bottomCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxHeight: maxHeight, maxWidth: 640),
constraints: BoxConstraints(maxHeight: maxHeight+padding.bottom, maxWidth: 640),
child: Padding(
padding: EdgeInsets.only(
left: 16, right: 16, bottom: max(padding.bottom, 16)),
left: 16,
right: 16,
bottom: max(padding.bottom + 16, 16),
),
child: Material(
color: colorScheme.surfaceContainerHigh,
color: context.theme.colorScheme.surfaceContainerHigh,
clipBehavior: Clip.antiAlias,
borderRadius: AppBorderRadius.largeBorderRadius,
child: child,
@@ -44,14 +51,14 @@ Future<T> showFloatingModalBottomSheet<T>({
bool isScrollControlled = false,
}) async {
final result = await showCustomModalBottomSheet(
context: context,
builder: builder,
enableDrag: isScrollControlled,
containerWidget: (_, animation, child) => FloatingModal(
isScrollControlled: isScrollControlled,
child: child,
),
expand: false);
context: context,
builder: builder,
enableDrag: isScrollControlled,
containerWidget:
(_, animation, child) =>
FloatingModal(isScrollControlled: isScrollControlled, child: child),
expand: false,
);
return result;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/components/base/marquee.dart';
import 'package:moodiary/utils/lru.dart';
@@ -24,23 +25,26 @@ class AdaptiveText extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final textTheme = Theme.of(context).textTheme;
final textScaler = MediaQuery.textScalerOf(context);
var textStyle = style;
if (isTileTitle == true) {
textStyle = textTheme.bodyLarge?.copyWith(color: colorScheme.onSurface);
textStyle = textTheme.bodyLarge?.copyWith(
color: context.theme.colorScheme.onSurface,
);
}
if (isTileSubtitle == true) {
textStyle = textTheme.bodyMedium?.copyWith(
color: colorScheme.onSurfaceVariant,
color: context.theme.colorScheme.onSurfaceVariant,
);
}
if (isTitle == true) {
textStyle = textTheme.titleLarge;
}
if (isPrimaryTitle == true) {
textStyle = textTheme.titleLarge?.copyWith(color: colorScheme.primary);
textStyle = textTheme.titleLarge?.copyWith(
color: context.theme.colorScheme.primary,
);
}
return LayoutBuilder(
builder: (context, constraints) {

View File

@@ -0,0 +1,169 @@
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:dartx/dartx.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/border.dart';
import 'package:moodiary/components/base/popup.dart';
import 'package:moodiary/components/base/qr/qr_code.dart';
import 'package:moodiary/components/base/qr/qr_scanner.dart';
import 'package:moodiary/components/base/tile/setting_tile.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'package:moodiary/utils/notice_util.dart';
class QrInputTile extends StatelessWidget {
final String title;
final String? subtitle;
final String? prefix;
final String value;
final bool withStyle;
final void Function(String)? onValue;
final Widget? leading;
final VoidCallback? onScan;
final VoidCallback? onInput;
const QrInputTile({
super.key,
required this.title,
this.subtitle,
required this.value,
this.onValue,
this.withStyle = true,
this.onScan,
this.onInput,
this.leading,
this.prefix,
});
@override
Widget build(BuildContext context) {
const validDuration = Duration(minutes: 2);
return AdaptiveListTile(
title: Text(title),
leading: leading,
subtitle:
subtitle ??
(value.isNotNullOrBlank
? Text(context.l10n.hasOption)
: Text(context.l10n.noOption)),
tileColor:
withStyle ? context.theme.colorScheme.surfaceContainerLow : null,
shape:
withStyle
? const RoundedRectangleBorder(
borderRadius: AppBorderRadius.mediumBorderRadius,
)
: null,
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Builder(
builder: (context) {
return IconButton.filled(
tooltip: context.l10n.genQrCodeTooltip,
onPressed: () {
if (value.isBlank) {
toast.info(message: context.l10n.genQrCodeError1(title));
return;
}
showPopupWidget(
targetContext: context,
child: EncryptQrCode(
data: value,
size: 96,
prefix: prefix,
validDuration: validDuration,
),
);
},
icon: Icon(
Icons.qr_code_rounded,
color: context.theme.colorScheme.onPrimary,
),
);
},
),
IconButton.filled(
tooltip: context.l10n.inputTooltip,
onPressed: () async {
final choice = await showDialog<String?>(
context: context,
builder: (context) {
return SimpleDialog(
title: Text(context.l10n.inputMethodTitle),
children: [
SimpleDialogOption(
child: Row(
spacing: 8.0,
children: [
const Icon(Icons.qr_code_scanner_rounded),
Text(context.l10n.inputMethodScanQrCode),
],
),
onPressed: () {
Navigator.pop(context, 'qr');
},
),
SimpleDialogOption(
child: Row(
spacing: 8.0,
children: [
const Icon(Icons.keyboard_rounded),
Text(context.l10n.inputMethodHandelInput),
],
),
onPressed: () {
Navigator.pop(context, 'input');
},
),
],
);
},
);
if (choice == null) return;
if (choice == 'qr' && context.mounted) {
if (onScan != null) {
onScan?.call();
return;
}
final res = await showQrScanner(
context: context,
validDuration: validDuration,
prefix: prefix,
);
if (res != null) {
onValue?.call(res);
}
}
if (choice == 'input' && context.mounted) {
if (onInput != null) {
onInput?.call();
return;
}
final res = await showTextInputDialog(
context: context,
textFields: [DialogTextField(initialText: value)],
title: title,
message: context.l10n.getKeyFromConsole,
style: AdaptiveStyle.material,
);
if (res != null && res.isNotEmpty) {
final value = res[0];
onValue?.call(value);
}
}
},
icon: Icon(
Icons.input_rounded,
color: context.theme.colorScheme.onPrimary,
),
),
],
),
);
}
}

View File

@@ -19,18 +19,12 @@ class AdaptiveTitleTile extends StatelessWidget {
'subtitle must be a String or a Widget',
);
return ListTile(
title: (title is String)
? AdaptiveText(
title,
isPrimaryTitle: true,
)
: title,
subtitle: (subtitle is String)
? AdaptiveText(
subtitle!,
isTileSubtitle: true,
)
: subtitle,
title:
(title is String) ? AdaptiveText(title, isPrimaryTitle: true) : title,
subtitle:
(subtitle is String)
? AdaptiveText(subtitle!, isTileSubtitle: true)
: subtitle,
);
}
}
@@ -46,6 +40,8 @@ class AdaptiveListTile extends StatelessWidget {
this.isFirst,
this.isLast,
this.contentPadding,
this.tileColor,
this.shape,
});
final dynamic title;
@@ -64,6 +60,10 @@ class AdaptiveListTile extends StatelessWidget {
final EdgeInsets? contentPadding;
final Color? tileColor;
final ShapeBorder? shape;
@override
Widget build(BuildContext context) {
assert(
@@ -83,25 +83,24 @@ class AdaptiveListTile extends StatelessWidget {
realSubtitle = (subtitle as Text).data;
}
return ListTile(
title: (realTitle is String)
? AdaptiveText(
realTitle,
isTileTitle: true,
)
: realTitle,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: isFirst == true ? const Radius.circular(12) : Radius.zero,
bottom: isLast == true ? const Radius.circular(12) : Radius.zero,
),
),
tileColor: tileColor,
title:
(realTitle is String)
? AdaptiveText(realTitle, isTileTitle: true)
: realTitle,
shape:
shape ??
RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: isFirst == true ? const Radius.circular(12) : Radius.zero,
bottom: isLast == true ? const Radius.circular(12) : Radius.zero,
),
),
contentPadding: contentPadding,
subtitle: (realSubtitle is String)
? AdaptiveText(
realSubtitle,
isTileSubtitle: true,
)
: realSubtitle,
subtitle:
(realSubtitle is String)
? AdaptiveText(realSubtitle, isTileSubtitle: true)
: realSubtitle,
trailing: trailing,
leading: leading,
onTap: onTap,
@@ -157,28 +156,26 @@ class AdaptiveSwitchListTile extends StatelessWidget {
realSubtitle = (subtitle as Text).data;
}
return SwitchListTile(
title: (realTitle is String)
? AdaptiveText(
realTitle,
isTileTitle: true,
)
: realTitle,
title:
(realTitle is String)
? AdaptiveText(realTitle, isTileTitle: true)
: realTitle,
secondary: secondary,
shape: RoundedRectangleBorder(
borderRadius: isSingle == true
? BorderRadius.circular(12)
: BorderRadius.vertical(
top: isFirst == true ? const Radius.circular(12) : Radius.zero,
bottom:
isLast == true ? const Radius.circular(12) : Radius.zero,
),
borderRadius:
isSingle == true
? BorderRadius.circular(12)
: BorderRadius.vertical(
top:
isFirst == true ? const Radius.circular(12) : Radius.zero,
bottom:
isLast == true ? const Radius.circular(12) : Radius.zero,
),
),
subtitle: (realSubtitle is String)
? AdaptiveText(
realSubtitle,
isTileSubtitle: true,
)
: realSubtitle,
subtitle:
(realSubtitle is String)
? AdaptiveText(realSubtitle, isTileSubtitle: true)
: realSubtitle,
value: value,
onChanged: onChanged,
);

View File

@@ -21,10 +21,7 @@ class Bubble extends StatelessWidget {
),
child: Align(
alignment: Alignment.topCenter,
child: Padding(
padding: const EdgeInsets.all(4.0),
child: child,
),
child: Padding(padding: const EdgeInsets.all(4.0), child: child),
),
);
}
@@ -38,9 +35,10 @@ class BubblePainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = color
..style = PaintingStyle.fill;
final paint =
Paint()
..color = color
..style = PaintingStyle.fill;
const arrowWidth = 16.0;
const arrowHeight = 8.0;
final rectWidth = size.width;
@@ -56,11 +54,12 @@ class BubblePainter extends CustomPainter {
);
// 创建路径
final path = Path()
..addRRect(rrect) // 添加圆角矩形
..moveTo((rectWidth - arrowWidth) / 2, rectHeight) // 箭头左侧
..lineTo(rectWidth / 2, rectHeight + arrowHeight) // 箭头尖端
..lineTo((rectWidth + arrowWidth) / 2, rectHeight); // 箭头右侧
final path =
Path()
..addRRect(rrect) // 添加圆角矩形
..moveTo((rectWidth - arrowWidth) / 2, rectHeight) // 箭头左侧
..lineTo(rectWidth / 2, rectHeight + arrowHeight) // 箭头尖端
..lineTo((rectWidth + arrowWidth) / 2, rectHeight); // 箭头右侧
canvas.drawPath(path, paint);
}

View File

@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/models/isar/category.dart';
import 'package:moodiary/pages/edit/edit_logic.dart';
import 'package:moodiary/pages/home/diary/diary_logic.dart';
import 'package:moodiary/presentation/isar.dart';
import 'package:moodiary/persistence/isar.dart';
import 'package:moodiary/utils/notice_util.dart';
import 'package:refreshed/refreshed.dart';
import 'category_add_state.dart';
@@ -25,10 +25,11 @@ class CategoryAddLogic extends GetxController {
Future<void> addCategory({required String text}) async {
if (text.isNotEmpty) {
final res =
await IsarUtil.insertACategory(Category()..categoryName = text);
final res = await IsarUtil.insertACategory(
Category()..categoryName = text,
);
if (res == false) {
NoticeUtil.showToast('已经存在同名分类,已自动重命名');
toast.info(message: '已经存在同名分类,已自动重命名');
}
getCategory();
await diaryLogic.updateCategory();

View File

@@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:moodiary/common/models/isar/category.dart';
import 'package:refreshed/refreshed.dart';
class CategoryAddState {
late RxList<Category> categoryList;

View File

@@ -1,7 +1,7 @@
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter/material.dart';
import 'package:moodiary/main.dart';
import 'package:refreshed/refreshed.dart';
import 'package:get/get.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'category_add_logic.dart';
@@ -12,7 +12,6 @@ class CategoryAddComponent extends StatelessWidget {
Widget build(BuildContext context) {
final logic = Get.put(CategoryAddLogic());
final state = Bind.find<CategoryAddLogic>().state;
final colorScheme = Theme.of(context).colorScheme;
return GetBuilder<CategoryAddLogic>(
assignId: true,
@@ -31,32 +30,34 @@ class CategoryAddComponent extends StatelessWidget {
children: [
FilledButton.icon(
icon: const Icon(Icons.add),
label: Text(l10n.categoryManageAdd),
label: Text(context.l10n.categoryManageAdd),
onPressed: () async {
final res = await showTextInputDialog(
context: context,
title: l10n.categoryManageAdd,
textFields: [
DialogTextField(
hintText: l10n.categoryManageName,
)
]);
context: context,
title: context.l10n.categoryManageAdd,
textFields: [
DialogTextField(
hintText: context.l10n.categoryManageName,
),
],
);
if (res != null) {
logic.addCategory(text: res.first);
}
},
),
Text(state.categoryList.length.toString())
Text(state.categoryList.length.toString()),
],
),
ActionChip(
label: Text(l10n.categoryNoCategory),
label: Text(context.l10n.categoryNoCategory),
onPressed: () {
logic.cancelCategory(context);
},
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
padding: EdgeInsets.zero,
backgroundColor: colorScheme.tertiaryContainer,
backgroundColor:
context.theme.colorScheme.tertiaryContainer,
),
...List.generate(state.categoryList.value.length, (index) {
return ActionChip(
@@ -66,7 +67,8 @@ class CategoryAddComponent extends StatelessWidget {
},
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
padding: EdgeInsets.zero,
backgroundColor: colorScheme.secondaryContainer,
backgroundColor:
context.theme.colorScheme.secondaryContainer,
);
}),
],

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/pages/home/diary/diary_logic.dart';
import 'package:moodiary/presentation/isar.dart';
import 'package:moodiary/persistence/isar.dart';
import 'package:moodiary/router/app_routes.dart';
import 'package:refreshed/refreshed.dart';
import 'category_choice_sheet_state.dart';

View File

@@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:moodiary/common/models/isar/category.dart';
import 'package:refreshed/refreshed.dart';
class CategoryChoiceSheetState {
RxList<Category> categoryList = <Category>[].obs;

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:moodiary/components/loading/loading.dart';
import 'package:moodiary/main.dart';
import 'package:refreshed/refreshed.dart';
import 'package:get/get.dart';
import 'package:moodiary/components/base/loading.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'category_choice_sheet_logic.dart';
import 'category_choice_sheet_state.dart';
@@ -15,9 +15,6 @@ class CategoryChoiceSheetComponent extends StatelessWidget {
final CategoryChoiceSheetState state =
Bind.find<CategoryChoiceSheetLogic>().state;
final colorScheme = Theme.of(context).colorScheme;
final textStyle = Theme.of(context).textTheme;
return GetBuilder<CategoryChoiceSheetLogic>(
assignId: true,
builder: (_) {
@@ -27,65 +24,74 @@ class CategoryChoiceSheetComponent extends StatelessWidget {
child: Obx(() {
return AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child: !state.isFetching.value
? Wrap(
spacing: 4.0,
runSpacing: 4.0,
alignment: WrapAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
l10n.categoryAllCategory,
style: textStyle.titleMedium,
),
Text(
state.categoryList.length.toString(),
style: textStyle.titleMedium,
)
],
),
ActionChip(
label: Text(l10n.categoryAll),
onPressed: () {
logic.selectCategory(categoryId: null);
},
materialTapTargetSize:
MaterialTapTargetSize.shrinkWrap,
padding: EdgeInsets.zero,
backgroundColor: colorScheme.tertiaryContainer,
),
...List.generate(state.categoryList.value.length,
(index) {
return ActionChip(
label: Text(
state.categoryList.value[index].categoryName),
child:
!state.isFetching.value
? Wrap(
spacing: 4.0,
runSpacing: 4.0,
alignment: WrapAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
context.l10n.categoryAllCategory,
style: context.textTheme.titleMedium,
),
Text(
state.categoryList.length.toString(),
style: context.textTheme.titleMedium,
),
],
),
ActionChip(
label: Text(context.l10n.categoryAll),
onPressed: () {
logic.selectCategory(
categoryId:
state.categoryList.value[index].id);
logic.selectCategory(categoryId: null);
},
materialTapTargetSize:
MaterialTapTargetSize.shrinkWrap,
padding: EdgeInsets.zero,
backgroundColor: colorScheme.secondaryContainer,
);
}),
Align(
alignment: Alignment.centerRight,
child: TextButton(
onPressed: () {
logic.toCategoryManage(context);
},
child: Text(l10n.settingFunctionCategoryManage),
backgroundColor:
context.theme.colorScheme.tertiaryContainer,
),
)
],
)
: const Center(
child: Processing(),
),
...List.generate(state.categoryList.value.length, (
index,
) {
return ActionChip(
label: Text(
state.categoryList.value[index].categoryName,
),
onPressed: () {
logic.selectCategory(
categoryId:
state.categoryList.value[index].id,
);
},
materialTapTargetSize:
MaterialTapTargetSize.shrinkWrap,
padding: EdgeInsets.zero,
backgroundColor:
context
.theme
.colorScheme
.secondaryContainer,
);
}),
Align(
alignment: Alignment.centerRight,
child: TextButton(
onPressed: () {
logic.toCategoryManage(context);
},
child: Text(
context.l10n.settingFunctionCategoryManage,
),
),
),
],
)
: const MoodiaryLoading(),
);
}),
),

View File

@@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:moodiary/pages/home/setting/setting_logic.dart';
import 'package:moodiary/presentation/pref.dart';
import 'package:moodiary/persistence/pref.dart';
import 'package:moodiary/utils/theme_util.dart';
import 'package:refreshed/refreshed.dart';
import 'color_sheet_state.dart';

View File

@@ -1,4 +1,4 @@
import 'package:moodiary/presentation/pref.dart';
import 'package:moodiary/persistence/pref.dart';
class ColorSheetState {
int currentColor = PrefUtil.getValue<int>('color')!;

View File

@@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/border.dart';
import 'package:moodiary/common/values/colors.dart';
import 'package:moodiary/components/base/marquee.dart';
import 'package:moodiary/main.dart';
import 'package:moodiary/presentation/pref.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'package:moodiary/persistence/pref.dart';
import 'package:moodiary/utils/theme_util.dart';
import 'package:refreshed/refreshed.dart';
import 'color_sheet_logic.dart';
import 'color_sheet_state.dart';
@@ -15,6 +15,7 @@ class ColorSheetComponent extends StatelessWidget {
const ColorSheetComponent({super.key});
Widget buildColorOption({
required BuildContext context,
required int currentColor,
required int realIndex,
required Brightness brightness,
@@ -38,7 +39,10 @@ class ColorSheetComponent extends StatelessWidget {
);
final textPainter = TextPainter(
text: TextSpan(text: AppColor.colorName(realIndex), style: textStyle),
text: TextSpan(
text: AppColor.colorName(realIndex, context),
style: textStyle,
),
textDirection: TextDirection.ltr,
textScaler: TextScaler.linear(PrefUtil.getValue<double>('fontScale')!),
)..layout();
@@ -78,7 +82,7 @@ class ColorSheetComponent extends StatelessWidget {
height: textPainter.height,
width: constraints.maxWidth - 8.0,
child: Marquee(
text: AppColor.colorName(realIndex),
text: AppColor.colorName(realIndex, context),
velocity: 20,
blankSpace: 20,
pauseAfterRound: const Duration(seconds: 1),
@@ -94,7 +98,7 @@ class ColorSheetComponent extends StatelessWidget {
),
)
: Text(
AppColor.colorName(realIndex),
AppColor.colorName(realIndex, context),
style: textStyle?.copyWith(
color: customColorScheme.onPrimary,
),
@@ -124,8 +128,6 @@ class ColorSheetComponent extends StatelessWidget {
Widget build(BuildContext context) {
final ColorSheetLogic logic = Get.put(ColorSheetLogic());
final ColorSheetState state = Bind.find<ColorSheetLogic>().state;
final textStyle = Theme.of(context).textTheme;
final colorScheme = Theme.of(context).colorScheme;
// 绘制普通配色
Widget buildCommonColor() {
@@ -140,7 +142,10 @@ class ColorSheetComponent extends StatelessWidget {
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(l10n.colorCommon, style: textStyle.titleMedium),
child: Text(
context.l10n.colorCommon,
style: context.textTheme.titleMedium,
),
),
GridView.builder(
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
@@ -155,10 +160,11 @@ class ColorSheetComponent extends StatelessWidget {
return LayoutBuilder(
builder: (context, constraints) {
return buildColorOption(
context: context,
currentColor: state.currentColor,
realIndex: realIndex,
brightness: colorScheme.brightness,
textStyle: textStyle.labelMedium,
brightness: context.theme.colorScheme.brightness,
textStyle: context.textTheme.labelMedium,
isSystemColor: realIndex == -1,
constraints: constraints,
onTap: () {

View File

@@ -1,11 +1,11 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:moodiary/presentation/isar.dart';
import 'package:moodiary/presentation/pref.dart';
import 'package:get/get.dart';
import 'package:moodiary/persistence/isar.dart';
import 'package:moodiary/persistence/pref.dart';
import 'package:moodiary/router/app_routes.dart';
import 'package:moodiary/utils/array_util.dart';
import 'package:refreshed/refreshed.dart';
class DashboardLogic extends GetxController {
//日记数量
@@ -52,28 +52,33 @@ class DashboardLogic extends GetxController {
//选中两个日期后,查询指定范围内的日记
Future<void> getMoodAndWeatherByRange(DateTime start, DateTime end) async {
final moodList = await IsarUtil.getMoodByDateRange(
start, end.subtract(const Duration(days: -1)));
start,
end.subtract(const Duration(days: -1)),
);
final weatherList = await IsarUtil.getWeatherByDateRange(
start, end.subtract(const Duration(days: -1)));
start,
end.subtract(const Duration(days: -1)),
);
//去掉没有天气
weatherList.removeWhere((item) => item.isEmpty);
if (moodList.isNotEmpty) {
recentMood.value = ArrayUtil.countList(moodList)
.entries
.reduce((a, b) => a.value > b.value ? a : b)
.key
.toString();
recentMood.value =
ArrayUtil.countList(
moodList,
).entries.reduce((a, b) => a.value > b.value ? a : b).key.toString();
} else {
recentMood.value = 'none';
}
if (weatherList.isNotEmpty) {
final weatherCode = List.generate(
weatherList.length, (index) => weatherList[index].first);
recentWeather.value = ArrayUtil.countList(weatherCode)
.entries
.reduce((a, b) => a.value > b.value ? a : b)
.key;
weatherList.length,
(index) => weatherList[index].first,
);
recentWeather.value =
ArrayUtil.countList(
weatherCode,
).entries.reduce((a, b) => a.value > b.value ? a : b).key;
} else {
recentWeather.value = 'none';
}
@@ -81,7 +86,8 @@ class DashboardLogic extends GetxController {
void getUseTime() {
final DateTime firstStart = DateTime.fromMillisecondsSinceEpoch(
PrefUtil.getValue<int>('startTime')!);
PrefUtil.getValue<int>('startTime')!,
);
final Duration duration = DateTime.now().difference(firstStart);
useTime.value = (duration.inDays + 1).toString();
}

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/components/base/text.dart';
import 'package:moodiary/main.dart';
import 'package:refreshed/refreshed.dart';
import 'package:moodiary/l10n/l10n.dart';
import 'dashboard_logic.dart';
@@ -11,8 +11,6 @@ class DashboardComponent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final logic = Get.put(DashboardLogic());
final colorScheme = Theme.of(context).colorScheme;
final textStyle = Theme.of(context).textTheme;
Widget buildSection({required String title, required String count}) {
return Column(
@@ -20,13 +18,15 @@ class DashboardComponent extends StatelessWidget {
children: [
AdaptiveText(
title,
style:
textStyle.labelMedium?.copyWith(color: colorScheme.onSurface),
style: context.textTheme.labelMedium?.copyWith(
color: context.theme.colorScheme.onSurface,
),
),
AnimatedText(
count,
style:
textStyle.titleMedium?.copyWith(color: colorScheme.secondary),
style: context.textTheme.titleMedium?.copyWith(
color: context.theme.colorScheme.secondary,
),
isFetching: count.isEmpty,
),
],
@@ -42,7 +42,7 @@ class DashboardComponent extends StatelessWidget {
flex: 1,
child: Obx(() {
return buildSection(
title: l10n.dashboardUseDays,
title: context.l10n.dashboardUseDays,
count: logic.useTime.value,
);
}),
@@ -51,7 +51,7 @@ class DashboardComponent extends StatelessWidget {
flex: 1,
child: Obx(() {
return buildSection(
title: l10n.dashboardTotalDiary,
title: context.l10n.dashboardTotalDiary,
count: logic.diaryCount.value,
);
}),
@@ -60,7 +60,7 @@ class DashboardComponent extends StatelessWidget {
flex: 1,
child: Obx(() {
return buildSection(
title: l10n.dashboardTotalText,
title: context.l10n.dashboardTotalText,
count: logic.contentCount.value,
);
}),
@@ -69,7 +69,7 @@ class DashboardComponent extends StatelessWidget {
flex: 1,
child: Obx(() {
return buildSection(
title: l10n.dashboardTotalCategory,
title: context.l10n.dashboardTotalCategory,
count: logic.categoryCount.value,
);
}),
@@ -82,7 +82,7 @@ class DashboardComponent extends StatelessWidget {
assignId: true,
builder: (_) {
return Card.filled(
color: colorScheme.surfaceContainerLow,
color: context.theme.colorScheme.surfaceContainerLow,
margin: EdgeInsets.zero,
child: Padding(
padding: const EdgeInsets.all(16.0),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/border.dart';
class AdaptiveBackground extends StatelessWidget {
@@ -8,17 +9,19 @@ class AdaptiveBackground extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return LayoutBuilder(
builder: (context, constraints) {
final bool showBackground = constraints.maxWidth >= 512;
if (!showBackground) return child;
return Container(
color: colorScheme.surfaceContainer,
color: context.theme.colorScheme.surfaceContainer,
padding: const EdgeInsets.only(top: 8, right: 8, bottom: 8),
child: ClipRRect(
borderRadius: AppBorderRadius.largeBorderRadius,
child: ColoredBox(color: colorScheme.surface, child: child),
child: ColoredBox(
color: context.theme.colorScheme.surface,
child: child,
),
),
);
},
@@ -40,13 +43,13 @@ class PageAdaptiveBackground extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (isHome) return child;
final colorScheme = Theme.of(context).colorScheme;
return LayoutBuilder(
builder: (context, constraints) {
final bool showBackground = constraints.maxWidth >= 600;
if (!showBackground) return child;
return Container(
color: colorScheme.surfaceContainer,
color: context.theme.colorScheme.surfaceContainer,
padding: const EdgeInsets.all(8.0),
child: ClipRRect(
borderRadius: AppBorderRadius.largeBorderRadius,

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/values/border.dart';
class OptionDialog extends StatelessWidget {
@@ -8,10 +9,11 @@ class OptionDialog extends StatelessWidget {
const OptionDialog({super.key, required this.title, required this.options});
Widget _buildOption(
{required String option,
required Function onTap,
required ColorScheme colorScheme}) {
Widget _buildOption({
required String option,
required Function onTap,
required ColorScheme colorScheme,
}) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Ink(
@@ -26,8 +28,10 @@ class OptionDialog extends StatelessWidget {
},
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Text(option,
style: TextStyle(color: colorScheme.onSecondaryContainer)),
child: Text(
option,
style: TextStyle(color: colorScheme.onSecondaryContainer),
),
),
),
),
@@ -36,13 +40,18 @@ class OptionDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return SimpleDialog(
title: Text(title),
children: options.entries
.map((entry) => _buildOption(
option: entry.key, onTap: entry.value, colorScheme: colorScheme))
.toList(),
children:
options.entries
.map(
(entry) => _buildOption(
option: entry.key,
onTap: entry.value,
colorScheme: context.theme.colorScheme,
),
)
.toList(),
);
}
}

View File

@@ -1,11 +1,11 @@
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:moodiary/common/models/isar/diary.dart';
import 'package:moodiary/components/diary_tab_view/diary_tab_view_logic.dart';
import 'package:moodiary/pages/diary_details/diary_details_logic.dart';
import 'package:moodiary/pages/home/diary/diary_logic.dart';
import 'package:moodiary/presentation/isar.dart';
import 'package:moodiary/persistence/isar.dart';
import 'package:moodiary/router/app_routes.dart';
import 'package:refreshed/refreshed.dart';
mixin BasicCardLogic {
Future<void> toDiary(Diary diary) async {

View File

@@ -1,11 +1,11 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:moodiary/common/models/isar/diary.dart';
import 'package:moodiary/common/values/border.dart';
import 'package:moodiary/common/values/diary_type.dart';
import 'package:moodiary/components/base/image.dart';
import 'package:moodiary/components/base/text.dart';
import 'package:moodiary/components/diary_card/basic_card_logic.dart';
import 'package:moodiary/utils/file_util.dart';
@@ -17,35 +17,23 @@ class CalendarDiaryCardComponent extends StatelessWidget with BasicCardLogic {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final textStyle = Theme.of(context).textTheme;
final pixelRatio = MediaQuery.devicePixelRatioOf(context);
Widget buildImage() {
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
spacing: 4.0,
spacing: 8.0,
children: List.generate(diary.imageName.length, (index) {
return SizedBox(
height: 100,
width: 100,
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: ResizeImage(
FileImage(
File(
FileUtil.getRealPath('image', diary.imageName[index]),
),
),
width: (100 * pixelRatio).toInt(),
),
fit: BoxFit.cover,
),
border: Border.all(color: colorScheme.outline),
borderRadius: AppBorderRadius.smallBorderRadius,
height: 100,
child: MoodiaryImage(
imagePath: FileUtil.getRealPath(
'image',
diary.imageName[index],
),
borderRadius: AppBorderRadius.smallBorderRadius,
showBorder: true,
size: 100,
),
);
}),
@@ -56,13 +44,15 @@ class CalendarDiaryCardComponent extends StatelessWidget with BasicCardLogic {
Widget buildTime() {
return Text(
DateFormat.yMMMMEEEEd().add_jms().format(diary.time),
style: textStyle.labelSmall?.copyWith(color: colorScheme.secondary),
style: context.textTheme.labelSmall?.copyWith(
color: context.theme.colorScheme.secondary,
),
);
}
return InkWell(
child: Card.filled(
color: colorScheme.surfaceContainerLow,
color: context.theme.colorScheme.surfaceContainerLow,
margin: EdgeInsets.zero,
child: InkWell(
borderRadius: AppBorderRadius.mediumBorderRadius,
@@ -82,7 +72,7 @@ class CalendarDiaryCardComponent extends StatelessWidget with BasicCardLogic {
FaIcon(
DiaryType.fromValue(diary.type).icon,
size: 10,
color: colorScheme.secondary,
color: context.theme.colorScheme.secondary,
),
],
),
@@ -90,16 +80,16 @@ class CalendarDiaryCardComponent extends StatelessWidget with BasicCardLogic {
EllipsisText(
diary.title.trim(),
maxLines: 1,
style: textStyle.titleMedium!.copyWith(
color: colorScheme.onSurface,
style: context.textTheme.titleMedium?.copyWith(
color: context.theme.colorScheme.onSurface,
),
),
if (diary.contentText.isNotEmpty)
EllipsisText(
diary.contentText.trim().removeLineBreaks(),
maxLines: 4,
style: textStyle.bodyMedium?.copyWith(
color: colorScheme.onSurface,
style: context.textTheme.bodyMedium?.copyWith(
color: context.theme.colorScheme.onSurface,
),
),
buildImage(),

View File

@@ -1,11 +1,11 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:moodiary/common/models/isar/diary.dart';
import 'package:moodiary/common/values/border.dart';
import 'package:moodiary/common/values/diary_type.dart';
import 'package:moodiary/components/base/image.dart';
import 'package:moodiary/components/base/text.dart';
import 'package:moodiary/components/diary_card/basic_card_logic.dart';
import 'package:moodiary/utils/file_util.dart';
@@ -17,30 +17,21 @@ class GirdDiaryCardComponent extends StatelessWidget with BasicCardLogic {
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final textStyle = Theme.of(context).textTheme;
final pixelRatio = MediaQuery.devicePixelRatioOf(context);
Widget buildImage() {
return Container(
height: 154.0,
decoration: BoxDecoration(
image: DecorationImage(
image: ResizeImage(
FileImage(
File(FileUtil.getRealPath('image', diary.imageName.first)),
),
width: (250 * pixelRatio).toInt(),
),
fit: BoxFit.cover,
),
return SizedBox(
height: 154,
child: ClipRRect(
borderRadius: AppBorderRadius.mediumBorderRadius,
child: MoodiaryImage(
imagePath: FileUtil.getRealPath('image', diary.imageName.first),
size: 250,
),
),
);
}
return Card.filled(
color: colorScheme.surfaceContainerLow,
color: context.theme.colorScheme.surfaceContainerLow,
margin: EdgeInsets.zero,
child: InkWell(
borderRadius: AppBorderRadius.mediumBorderRadius,
@@ -64,16 +55,16 @@ class GirdDiaryCardComponent extends StatelessWidget with BasicCardLogic {
EllipsisText(
diary.title.trim(),
maxLines: 1,
style: textStyle.titleMedium?.copyWith(
color: colorScheme.onSurface,
style: context.textTheme.titleMedium?.copyWith(
color: context.theme.colorScheme.onSurface,
),
),
if (diary.contentText.isNotEmpty)
EllipsisText(
diary.contentText.trim().removeLineBreaks(),
maxLines: 4,
style: textStyle.bodyMedium?.copyWith(
color: colorScheme.onSurface,
style: context.textTheme.bodyMedium?.copyWith(
color: context.theme.colorScheme.onSurface,
),
),
Row(
@@ -81,15 +72,15 @@ class GirdDiaryCardComponent extends StatelessWidget with BasicCardLogic {
children: [
Text(
DateFormat.yMd().add_Hms().format(diary.time),
style: textStyle.labelSmall?.copyWith(
color: colorScheme.onSurfaceVariant,
style: context.textTheme.labelSmall?.copyWith(
color: context.theme.colorScheme.onSurfaceVariant,
),
overflow: TextOverflow.ellipsis,
),
FaIcon(
DiaryType.fromValue(diary.type).icon,
size: 10,
color: colorScheme.onSurfaceVariant,
color: context.theme.colorScheme.onSurfaceVariant,
),
],
),

Some files were not shown because too many files have changed in this diff Show More