Plugin
package_info_plus
Use case
On the web, PackageInfo.fromPlatform() reads version / buildNumber from version.json, fetched from the server at runtime. That file describes the currently deployed bundle, not the one running. A client on a stale cached bundle therefore reports the new version, so update gates and "running version" displays fail for exactly the users they exist for (#2675, closed as not planned). The fetch can also fail outright (#456, #3028).
Since Flutter 3.47.0 (flutter/flutter#187935), flutter_tools injects the app's pubspec version (or --build-name / --build-number) as the dart-defines FLUTTER_BUILD_NAME / FLUTTER_BUILD_NUMBER, exposed as appBuildName / appBuildNumber in package:flutter/services.dart. They are compiled into the bundle, so they always describe the code that is executing.
Proposal
In the web implementation, prefer the compile-time values when present and keep version.json as the fallback:
const _buildName = bool.hasEnvironment('FLUTTER_BUILD_NAME')
? String.fromEnvironment('FLUTTER_BUILD_NAME')
: null;
const _buildNumber = bool.hasEnvironment('FLUTTER_BUILD_NUMBER')
? String.fromEnvironment('FLUTTER_BUILD_NUMBER')
: null;
Reading the defines through bool.hasEnvironment (instead of importing appBuildName) keeps the current minimum Flutter version: older SDKs just don't define them, and behaviour is unchanged. On native platforms nothing changes.
This fixes #2675 transparently for every consumer, including SDKs that derive their release from package_info_plus (for example sentry_flutter's release name).
PR: #3990 (replaces the opt-in approach of #3874, which I closed once the Flutter side landed).
Plugin
package_info_plus
Use case
On the web,
PackageInfo.fromPlatform()readsversion/buildNumberfromversion.json, fetched from the server at runtime. That file describes the currently deployed bundle, not the one running. A client on a stale cached bundle therefore reports the new version, so update gates and "running version" displays fail for exactly the users they exist for (#2675, closed as not planned). The fetch can also fail outright (#456, #3028).Since Flutter 3.47.0 (flutter/flutter#187935),
flutter_toolsinjects the app's pubspecversion(or--build-name/--build-number) as the dart-definesFLUTTER_BUILD_NAME/FLUTTER_BUILD_NUMBER, exposed asappBuildName/appBuildNumberinpackage:flutter/services.dart. They are compiled into the bundle, so they always describe the code that is executing.Proposal
In the web implementation, prefer the compile-time values when present and keep
version.jsonas the fallback:Reading the defines through
bool.hasEnvironment(instead of importingappBuildName) keeps the current minimum Flutter version: older SDKs just don't define them, and behaviour is unchanged. On native platforms nothing changes.This fixes #2675 transparently for every consumer, including SDKs that derive their release from package_info_plus (for example
sentry_flutter's release name).PR: #3990 (replaces the opt-in approach of #3874, which I closed once the Flutter side landed).