Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/codeql-default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.44.4'
flutter-version: '3.47.0'
cache: true

- name: Cache Gradle dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.44.4'
flutter-version: '3.47.0'
cache: true
- name: Install Flutter dependencies
run: flutter pub get
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.44.4'
flutter-version: '3.47.0'
cache: true

- name: Install dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.44.4'
flutter-version: '3.47.0'
cache: true

- name: Cache Gradle dependencies
Expand Down
23 changes: 12 additions & 11 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ This file provides context for AI assistants working on this project.

| Aspect | Value |
|--------|-------|
| Framework | Flutter 3.44.4 (pinned — see "Before Coding") |
| Framework | Flutter 3.47.0 (pinned — see "Before Coding") |
| Android SDK | minSdk 30 (Android 11), target 36 — do NOT lower minSdk, see Gotcha #9 |
| Weather API | Open-Meteo (free, no key) |
| Charting | Native SVG (SvgChartGenerator.kt + AndroidSVG) |
Expand Down Expand Up @@ -146,25 +146,26 @@ build. The project therefore has **zero Flutter plugins with native code**
(`GeneratedPluginRegistrant` is empty): `home_widget` and `geolocator` were both removed in
favour of native implementations (`WidgetStore`/`LocationProvider` over the method channel).

**With no KGP plugin present, Flutter 3.44.4 builds clean** (unpinned from 3.41.7 to 3.44.0
2026-05; bumped to the 3.44.1 then 3.44.4 patch 2026-06). Flutter 3.44.4 still *tries* to force-apply
`kotlin-android` to `:app` and logs a
benign warning — `Applying the Kotlin Android Plugin (KGP) was unsuccessful. KGP was not found
on the classpath.` — but the apply is caught (`FlutterPluginUtils.kt:633`) and the build
succeeds. That one warning line is expected; ignore it (Flutter plans to drop the force-apply,
flutter/flutter#184837).
**With no KGP plugin present, Flutter 3.47.0 builds clean** (unpinned from 3.41.7 to 3.44.0
2026-05; 3.44.1 → 3.44.4 patches 2026-06; bumped to 3.47.0 2026-08). Flutter 3.47 supports
built-in Kotlin first-class: the old force-apply of `kotlin-android` is now gated on
`isBuiltInKotlinEnabled()` (AGP ≥ 9 + `android.builtInKotlin=true` skips it entirely,
flutter/flutter#184837 closed), so the benign "KGP was not found on the classpath" warning
that 3.44.x logged is gone. Note: 3.47's `flutter_localizations` pins `intl` via a caret
(`^0.20.3`) instead of an exact version, and the app's `intl` constraint is `any` (SDK-pinned;
dart.dev/go/sdk-version-pinning) so dependabot has nothing to bump.

- **Before coding, check the toolchain & deps.** Confirm `flutter --version` is **3.44.4** (the
- **Before coding, check the toolchain & deps.** Confirm `flutter --version` is **3.47.0** (the
pinned version — don't unintentionally build on another); run `flutter pub outdated` to review
dependency updates and note any Flutter release past 3.44.4. Treat **any** Flutter or dependency
dependency updates and note any Flutter release past 3.47.0. Treat **any** Flutter or dependency
bump as a *deliberate, verified* change — it can re-break the built-in-Kotlin setup (see history
below) — not a casual upgrade.
- **CRITICAL:** do **not** add any Flutter plugin that applies KGP (most native plugins do) — it
will break the build under built-in Kotlin. Prefer a native implementation over the method
channel, or a plugin version that supports built-in Kotlin. If a KGP plugin is unavoidable,
you must switch to the legacy path: `android.builtInKotlin=false` + re-add `id("kotlin-android")`
to `app/build.gradle.kts` (KGP is already declared `apply false` in `settings.gradle.kts`).
- **CI:** `flutter-version: '3.44.4'` in `.github/workflows/`.
- **CI:** `flutter-version: '3.47.0'` in `.github/workflows/`.
- **Verify after any toolchain/plugin change:** `make analyze` + `make test` + a debug build.
After switching the local Flutter SDK version, run `flutter clean` first (stale kernel caches
from a different Dart version cause spurious `dot-shorthands` framework-compile errors).
Expand Down
8 changes: 8 additions & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ analyzer:
errors:
missing_return: error
missing_required_param: error
exclude:
- build/**
- android/**
- ios/**
- web/**
- windows/**
- macos/**
- linux/**
language:
strict-casts: true
strict-inference: true
Expand Down
3 changes: 2 additions & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ android.useAndroidX=true

# AGP 9 built-in Kotlin: no module applies the Kotlin Gradle Plugin (kotlin-android),
# so AGP compiles Kotlin directly. The project keeps zero KGP-using plugins (home_widget +
# geolocator went native) so this works under Flutter 3.44.0. builtInKotlin defaults to true
# geolocator went native). Flutter 3.47+ supports built-in Kotlin first-class (it skips the
# old kotlin-android force-apply when AGP >= 9 has builtInKotlin on). builtInKotlin defaults to true
# on AGP 9; set explicitly to document intent. Do NOT add a plugin that applies KGP — see CLAUDE.md.
#
# newDsl is kept false because the Flutter Gradle plugin path we use does not support the new
Expand Down
2 changes: 1 addition & 1 deletion android/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ plugins {
id("com.android.application") version "9.0.1" apply false
// Declared (never applied) so Flutter's tooling can read a KGP version; Kotlin
// compilation is handled by AGP built-in Kotlin, not this plugin.
id("org.jetbrains.kotlin.android") version "2.2.21" apply false
id("org.jetbrains.kotlin.android") version "2.4.0" apply false
}

include(":app")
22 changes: 11 additions & 11 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,10 @@ packages:
dependency: "direct main"
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
sha256: "1ca20c894b1717686a2319b8548763d812bc0aabdac580420a44c5178c57a867"
url: "https://pub.dev"
source: hosted
version: "0.20.2"
version: "0.20.3"
leak_tracker:
dependency: transitive
description:
Expand Down Expand Up @@ -132,10 +132,10 @@ packages:
dependency: transitive
description:
name: matcher
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
sha256: "31bd099b47c10cd1aeb55146a2d46ce0277630ecef3f7dae54ad7873f36696cd"
url: "https://pub.dev"
source: hosted
version: "0.12.19"
version: "0.12.20"
material_color_utilities:
dependency: transitive
description:
Expand All @@ -148,10 +148,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.0"
mocktail:
dependency: "direct dev"
description:
Expand Down Expand Up @@ -217,10 +217,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
sha256: "2a122cbe059f8b610d3a5415f42e255b6c17b1f21eee1d960f31080237fb4f11"
url: "https://pub.dev"
source: hosted
version: "0.7.11"
version: "0.7.12"
typed_data:
dependency: transitive
description:
Expand All @@ -233,10 +233,10 @@ packages:
dependency: transitive
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
sha256: f36f9f3be64c6198714492bb455c11056e33e2f85d9a0b676a48301e44fdcf47
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.4.2"
vm_service:
dependency: transitive
description:
Expand All @@ -254,5 +254,5 @@ packages:
source: hosted
version: "1.1.1"
sdks:
dart: ">=3.10.4 <4.0.0"
dart: ">=3.11.0-0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
7 changes: 5 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,11 @@ dependencies:
# org.bortnik.meteogram/svg method channel (LocationBridge / NativeSvgService.reverseGeocode).
# This keeps the app free of any Kotlin-Gradle-Plugin plugin, required by AGP-9 built-in Kotlin.

# Internationalization
intl: ^0.20.2
# Internationalization — `any` because the Flutter SDK pins intl exactly via
# flutter_localizations (https://dart.dev/go/sdk-version-pinning); a concrete
# constraint here can never out-resolve the pin and only generates unsolvable
# dependabot bumps.
intl: any

dev_dependencies:
flutter_test:
Expand Down
Loading