fluttercommunity / plus_plugins

Flutter Community Plus Plugins
BSD 3-Clause "New" or "Revised" License
1.59k stars 960 forks source link

[Bug]: [package_info_plus] Web: Version info returns next version in server #2675

Open rpaat opened 7 months ago

rpaat commented 7 months ago

Platform

Web

Plugin

package_info_plus

Version

5.0.1

Flutter SDK

3.19.2

Steps to reproduce

  1. Deploy app to hosting
  2. Open app in browser
  3. Bump app version
  4. Deploy new version to hosting
  5. Call PackageInfo.fromPlatform() in already running app and check app version in app
  6. New upcoming version info from hosting is shown instead of the currently running app version

Code Sample

No response

Logs

NA

Flutter Doctor

[√] Flutter (Channel stable, 3.19.2, on Microsoft Windows [Version 10.0.22631.3155], locale et-EE)
    • Flutter version 3.19.2 on channel stable at C:\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 7482962148 (13 days ago), 2024-02-27 16:51:22 -0500
    • Engine revision 04817c99c9
    • Dart version 3.3.0
    • DevTools version 2.31.1                                                                                                                                                  09:17

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at C:\Android\SDK
    • Platform android-29, build-tools 29.0.3
    • ANDROID_HOME = C:\Android\SDK
    • Java binary at: C:\Program Files\Android\Android Studio\jbr\bin\java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop Windows apps (Visual Studio Community 2019 16.11.13)
    • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
    • Visual Studio Community 2019 version 16.11.32413.511
    • Windows 10 SDK version 10.0.19041.0

[√] Android Studio (version 2022.2)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694)

[√] VS Code (version 1.86.2)
    • VS Code at C:\Users\Rainer Paat\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.83.20240201

[√] VS Code (version 1.48.0-insider)
    • VS Code at C:\Users\Rainer Paat\AppData\Local\Programs\Microsoft VS Code Insiders
    • Flutter extension can be installed from:
       https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[√] Connected device (3 available)
    • Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version 10.0.22631.3155]
    • Chrome (web)      • chrome  • web-javascript • Google Chrome 122.0.6261.95
    • Edge (web)        • edge    • web-javascript • Microsoft Edge 122.0.2365.66

[√] Network resources
    • All expected network resources are available.

• No issues found!

Checklist before submitting a bug

miquelbeltran commented 7 months ago

This is definitely not documented, but the plugin works by obtaining the information from the version.json stored where the app is running from. So it depends on whatever is in that version.json file.

rpaat commented 7 months ago

When looking at the code then cache is deliberately being avoided https://github.com/fluttercommunity/plus_plugins/blob/2119168267e436e5900ea09cf68dd110e51b01e0/packages/package_info_plus/package_info_plus/lib/src/package_info_plus_web.dart#L45C1-L48C54

miquelbeltran commented 7 months ago

Yes, implemented here some years ago: https://github.com/fluttercommunity/plus_plugins/commit/25e72e79391e798425b6a3c6c922863dfb7ff6b6

The original ticket has some information about this: https://github.com/fluttercommunity/plus_plugins/issues/225

I am not a web expert, so I cannot chip in if this is correct or not.

AriasBros commented 6 months ago

The source of the problem I think is the nature of the web implementation, that is dependent of an external resource that needs to be loaded with a fetch request (GET version.json) and as all web resources, it has its own cache.

You can remove the buster cache, but then you will depend of the browser cache invalidation. Your main.dart.js and your version.json can be invalidated in different moments, so you will be in the same situation.

And this only thinking in the browser cache invalidation, but it could be other cache layers, like for example an AWS CloudFront cache invalidation layer, or others.

It is a complicated situation, to be honest.

We could add a new parameter to opt out the cache buster. Maybe that could mitigate the issue, but in my view, it will be there yet, just happening sometimes, instead always.

Or, we could implement a solution no dependent of the version.json file. For example, in the web build process of the app, the package could inject the same information that we can find in the version.json file in a dart file. In that way, you can know exactly which version of the app you are seeing in your browser, because the information it is in the same main.dart.js of your app.

Of course, this is just a theoretical solution and I don't know if it could be implemented even.

RoarGronmo commented 4 months ago

I'll suggest you could collect the version mentioned in the pubespec.yaml file and refer it as "cachedVersions", so when you reference that you are not relying on the /version.json implementation.

You may need to implement it with a builder like dart run build_runner build --delete-conflicting-outputs to generate the .dart files, then theese will (may?) be a part of "static" pages in the browser, and you can then compare that version to the version provided with the /versjon.json from the recently published one.

This may solve the problem mentioned above also, on how to inform the user that there is an updated version of the (web)app, and you need to refresh it (done programmatically or by Ctrl+F5)

RoarGronmo commented 4 months ago

Maybe here are some hints on collecting the pubspec.yaml version info on build.

https://stackoverflow.com/questions/23613279/access-to-pubspec-yaml-attributes-version-from-dart-app

https://stackoverflow.com/a/75064421/4475206

RoarGronmo commented 4 months ago

I made a suggestion to the flutter team, maybe they hear us... https://github.com/flutter/flutter/issues/149725

github-actions[bot] commented 1 month ago

This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 15 days

RoarGronmo commented 1 month ago

Keep open.

lukasnevosad commented 3 weeks ago

Discussed in https://github.com/flutter/flutter/issues/149031

Personally I think that appending the cachebuster query string is a very good intention, but unfortunately results in unwanted behavior. The underlying issue is definitely in the framework, but I think most devs would prefer the reported version to be the actual version of the other loaded assets than the most recent deployed version.