個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Colloidal silver electrolysis timer calculator
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A Flutter app for calculating and timing colloidal silver electrolysis sessions. Enter your water volume, electrode current, and target PPM concentration — the app computes the required electrolysis time using Faraday's Law and guides you through the session with a live countdown, electrode cleaning reminders, and push notifications.
Supports Android, iOS, and Web.檢視完整 README ↗A Flutter app for calculating and timing colloidal silver electrolysis sessions. Enter your water volume, electrode current, and target PPM concentration — the app computes the required electrolysis time using Faraday's Law and guides you through the session with a live countdown, electrode cleaning reminders, and push notifications.
Supports Android, iOS, and Web.
minSdk 24 (Android 7.0); toolchain is AGP 9.1 / Gradle 9.3 / Kotlin 2.4flutter pub get
# List connected devices/emulators
flutter devices
# Run on a specific device
flutter run -d <device-id>
# Run on the first available device
flutter run
# Android APK
flutter build apk
# Android App Bundle (for Play Store)
flutter build appbundle
# iOS (requires macOS + Xcode)
flutter build ios
# Web
flutter build web
The required electrolysis time is derived from Faraday's Law of Electrolysis:
time (s) = (PPM × Volume (L) × F) / (M_Ag × I (A) × 1000)
| Symbol | Value | Description |
|---|---|---|
| F | 96,485 C/mol | Faraday constant |
| M_Ag | 107.87 g/mol | Molar mass of silver |
| I | user input | Electrode current in amperes |
| PPM | user input | Target concentration in mg/L |
Several packages require generated code. After modifying any file annotated with @freezed, @riverpod, @JsonSerializable, or a Drift table class, regenerate:
dart run build_runner build --delete-conflicting-outputs
Never manually edit *.g.dart or *.freezed.dart files.
# Run all tests
flutter test
# Run a single file
flutter test test/core/silver_calculator_test.dart
flutter analyze
lib/
├── main.dart # App entry point; initialises SharedPreferences & NotificationService
├── app.dart # MaterialApp.router with theme + go_router wiring
├── core/
│ ├── constants/ # AppConstants (SharedPreferences keys, notification IDs), PhysicsConstants
│ ├── routing/ # go_router setup; /timer route has a guard requiring a calculation result
│ ├── theme/ # AppTheme (light/dark), AppColors
│ ├── extensions/ # DurationExtensions
│ └── utils/
│ └── silver_calculator.dart # Pure calculation service (Faraday's Law)
├── features/
│ ├── calculator/ # Input form, device picker, PPM presets, result card
│ ├── devices/ # Device library — model, repository, manage/pick UI
│ ├── timer/ # Countdown controller, circular timer widget, notification service
│ ├── history/ # Drift/SQLite session log (also hosts the Devices table)
│ └── settings/ # SharedPreferences-backed settings with freezed model
└── shared/
└── widgets/
└── app_scaffold.dart # Bottom navigation shell (Calculator / Timer / History)
| Concern | Package |
|---|---|
| State management | flutter_riverpod + riverpod_annotation |
| Navigation | go_router |
| Immutable models | freezed |
| Persistence (history, devices) | drift (SQLite) |
| Persistence (settings) | shared_preferences |
| Notifications | flutter_local_notifications + timezone |
| Animations | flutter_animate, percent_indicator |
| Permission | Reason |
|---|---|
POST_NOTIFICATIONS | Timer completion and cleaning alarm notifications (Android 13+) |
SCHEDULE_EXACT_ALARM / USE_EXACT_ALARM | Precise notification scheduling |
RECEIVE_BOOT_COMPLETED | Reschedule exact alarms after device reboot |
WAKE_LOCK | Wake screen when the completion alarm fires |
USE_FULL_SCREEN_INTENT | Show alarm on the lock screen (Android 14+) |
The version is defined in one place: version: X.Y.Z+N in pubspec.yaml. Bump it with tool/bump_version.sh, merge the
release PR into main, then push a vX.Y.Z tag: .github/workflows/release.yml builds and publishes web, Android and iOS and
creates the GitHub release. The full process, dry runs and required secrets are in docs/release.md.
See docs/README.md: release process and the architecture decision records (ADRs).
Issues and pull requests are welcome. See CONTRIBUTING.md for the workflow (feature branch, squash-merged PR), the checks CI runs and how to add translations, and the Code of Conduct. Security problems go through SECURITY.md.