The application Implements a scorecard for an arbitrary number of players and game rounds. It has been tested on Android, IOS, Chrome, macOS, and Windows 11. Two scorecard types are supported
- Basic scorecard with individual round scores and player total scores
- Phase capture plus individual round scores and player total scores plus dropdowns that let you pick a completed phase. Hovering over the player's total score will show you which phases have been captured (the set of phase dropdown selections)
Preferences
- The game configuration is saved to SharedPreferneces when a game is started
- The game configuration is loaded as the default when showing the spalsh screen to start a new game
Notes
- Player's names can be edited by clicking on the name cell in the scoring table. The name can be changed in the modal editing panel that appears.
- Round scores can be edited by clicking on a score cell in the scoring table. The round score can be changed in the modal editing panel that ppears.
- The aggregated player scores will be totaled under the player's name.
- The "New Game" iconin the app bar. will clear the board scores and optionally the player names for times you want to change the order
- The "Home" or "Change Score Card Type" icon in the app bar will let you return to the start screen that lets you change the number of players and the data entry types (score & phase)
- Restarting the same game config does not change the gameId. This is a "feature"
- When debugging the web app with the IDE, the LocalStorage is not persisted across sessions. This is a "feature" of the fact that the web session is on a different port every time it is run.
- Unable to get macOS integration tests to run as GitHub Actions due to code signing requirement.
- Unable to get iOS integration tests to run reliably as GitHub Actions. Cause to be determined.
Links to latest versions are here https://freemansoft.github.io/
Or build your own copy...
- Clone this repo.
- Open the whole repo in VSCode
- This project uses
fvmto set the correct flutter version. Installfvm.- Mac You can run the script
install-fvm.shto install the tools and the correct version of fvm from scratch - Windows See fvm installation guide
- Use in an elevated command powershell prompt to install
fvm. Needs to be done only oncechoco install fvmchoco upgrade fvm
- From a command prompt in vscode/cursor after installing
fvmfvm install 3.38.5or whatever the version you need isfvm use 3.38.5
- Mac You can run the script
- Select the run view on the left hand side
- Select fs_score_card in the run drop down menu
- Press the green run button
- The application will run on an emulator, simulator, macos, windows, web or connected device.
Your machine may require that you replace any flutter commands with fvm flutter and dart with fvm dart to use the correct version of Flutter as manged by fvm
Make sure to regenerate the dart localization files after making any changes to the internationalization arb files using the command flutter gen-l10n. The command flutter gen-l10n has already been run the current version of the code.
Other options include running flutter pub get or doing a build.
You can test this locally using the run view in VSCode or using the command line.
Release builds can be created from the command line individually for each platform or via the build_distributable.sh and build_distributable.ps1 scripts.
- The IDE and the Android simulator on Mac or PC
- The IDE and the iOS emulator on Mac
- The IDE and a hardware connected Android device on a Mac or PC
- The IDE and a hardware connected iOS device on a Mac
- macOS app on a Mac
- windows fat app on PC
- A Web App on Mac or PC
- (Android) Create an apk and downloaded it to a device
- Build the android arm64 package. Including the
android-arm64makes it a single target binary and drops the size from 23MB to 8MBflutter build apk --target-platform android-arm64- The parameter
android-arm64makes it a single target binary and drops the size from 23MB to 8MB. There aren't any interesting x86 android devices anyway.
- Share
build/app/outputs/apk/release/fs_score_card-v<release>-release.apkto devices. This can be done by emailing or by pushing the apk to a shared storage- You can share the generic named apk from
build/outputs/flutter-apk/app-release.apkThere should be an associatedshafile there.
- You can share the generic named apk from
- Build the android arm64 package. Including the
Android build notes: Android apks end up bult in two places. Stack Overflow
build/app/outputs/apkIncluding app name and version in theapkfilename.build/app/outputs/apk/release/fs_score_card-v<version>-release.apkbuild/app/outputs/apk/debug/fs_score_card-v<version>-debug.apk
build/app/outputs/flutter-apkGeneric apk without the app name and version in theapkfilename. These include sha1 files.build/app/outputs/flutter-apk/apk-release.apkbuild/app/outputs/flutter-apk/app-debug.ap
- Onboarding
- Enable the in your workspacegoogle play store service
- Create releases in the Google Play store console
- Onboard to the store, pay $25, verify identity
- Connect to https://play.google.com/console and verify your account
- Install the Google Play console app on your android device and authenticate
- Set up the signing keys
- Build the app bundle with
flutter build appbundle --release- That doesn't work because it has to be signed.
- ...
You can test this locally using the IDE and the iOS simulator or hardware connected ios device on a Mac.
Standalone testing is driven through Apple store connect
- open the
iosfolder in xcode if you need to. I didn't need xcode for iOS builds the way I did for MacOS. flutter build ipaorflutter build ipa --release- Do the store thing - upload the ipa via Apple Transporter app and do all the configuration in testflight and the store
Alternatively - use the xcode archive route like we do for macOS
flutter build ipa --releaseto build the ios app and copy info frompubspec.yamlinto the xcode iOS files- Open the
iosproject in XCode. This opens the iOS target of the Flutter project Product > ArchiveValidate App-->ValidateDistribute App-->App Store Connect
Validate the version number and build ID on the splash screen. It should match the value in pubpspec.yaml. The version number is set in pubspec.yaml.
You can test this locally using the IDE on a Mac
MacOS builds are separate from iOS builds and must be uploaded to the store separately. Follow https://docs.flutter.dev/deployment/macos
flutter build macos --releaseto build the project and copy thepubspec.yamlinto the xcode macOS files- Open the
macOSdirectory in XCode. This opens the MacOS target of the Flutter project.- XCode
Product > Archiveit will build an archive - A new XCode window will pop up
- XCode
Validate App-->Validate - XCode
Distribute App-->App Store Connect
- XCode
Validate the version number and build ID on the splash screen. It should match the value in pubpspec.yaml. The version number is set in pubspec.yaml.
To release macOS after TestFlight. This works for iOS also
- Open AppStoreConnect web site
- Navigagte to App
FreemanS Score Card - Click on the
+sign next tomacOS Appand create the new release - Scroll down and add the
Buildyou wish to this release. - Update images, text and other data and then submit for review
You can test this locally using the IDE and a web browser like Chrome
- Create a distributable web package that can be distributed for people to web test locally
- Build the package
flutter build weborflutter build web --release - create a zip file of
build/web - Share the zip. They can unzip it and put the contents of the
webfolder in the web server docroot. Thewebfolder should not be part of the path.
- Build the package
Change this to match your deployment. These notes exist so I remember the process!
The following works for hosting this app on my github.io pages. I host this app on my github.io pages.
- Build the web app with
flutter build web --base-href=/freemans-score-card/ - Copy the contents of
build/webexcluding the canvaskit directory to a local clone of https://github.com/freemansoft/freemansoft.github.io- We are going to use the Google CDN CanvasKit and don't need to take up space in our repo with the binary
- You can test the site locally by running a local web server
python -m http.server 8000from a terminal prompt in the root of the github.io repo and navigating to http://localhost:8000/freemans-score-card/ - Commit the files and push them to GitHub.
- Test with GitHub pages https://freemansoft.github.io/freemans-score-card
You can test this locally using the IDE on a Windows machine.
- Build the image on a windows machine with
flutter build windows - Double click on the
exeinbuild\\windows\x64\runner\Release\fs_score_card.exe - You cannot copy just the exe somewhere and expect it to work
An msix section has already been added to customize the msi installer creator output https://pub.dev/packages/msix
- Build the image on a windows machine with
flutter build windows - Use the
msixpackage to create a windows installerflutter pub run msix:createdart run msix:createthis will offer to install a self signedpfxceertificate the first time it runs. Allow this.
- Copy the created
msixfile located inbuild\windows\x64\runner\Release\fs_score_card.msixto the target location where it can be installed from.
to be documented Windows standalone app packaged builds.
Integration tests can't be run against browsers. Web based integration tests are not supported (2025/07)
The integration tests were generated by copilot and are copilot updated. You can run them with
flutter test integration_test/app_test.dart| Platform | Support | GitHub Action Status |
|---|---|---|
| MacOS | yes | Deployed. Disabled due to code signing requirements |
| Windows | yes | Deployed. Enabled - cheapest because no emulator |
| Linux | not tested | No. Not tested |
| Android | yes | Deployed. Enabled |
| iOS | yes | Deployed. Disabled due to expense |
| Web | integration test not supported | No. Web integration test not supported |
GitHub actions run integration tests on various platforms when repo receives push to GitHub.
Files are located in github workflows
- Java 21 installations will get an error because this is using gradle 8.10.2 which matches Java 23.
- I'm on Java 21 matches against gradle 8.5
- This android build requires at least gradle 8.7.
- If you go to plugin version 8.8 to work with gradle 8.10.2 you get an ndk version error
- So we left the "Could not create task generateLockfiles error.
| Java | Gradle (min) | Android Plugin | API Level | Android Studio Version |
|---|---|---|---|---|
| 21 | 8.4 | 8.3 | 34 | . |
| ?? | 8.6 | 8.4 | 34 | . |
| ?? | 8.7 | 8.5 | 34 | . |
| 22 | 8.7 | 8.6 | 34 | . |
| ?? | 8.9 | 8.7 | 34 | . |
| 23 | 8.10 | 8.8 | 35 | . |
| ?? | 8.11 | 8.9 | 35 | . |
| ?? | 8.11 | 8.10 | 35 | . |
| ?? | 8.13 | 8.11 | 35 | . |
| ?? | 8.13 | 8.12 | 35 | . |
| ?? | ? | ? | 36 | Android Studio 2025 |
- https://docs.gradle.org/current/userguide/compatibility.html
- https://developer.android.com/build/releases/gradle-plugin
- https://developer.android.com/build/releases/past-releases
Android and IOS icons generated using the appicon.co App Icon Generator. The resulting icon is in /assets/logos All icons are derived from this 1024x1024 image.
Use flutter_launcher_icons to create change the icons for all the targets. flutter_launcher_icons configuration is in pubspec.yaml
dart run flutter_launcher_iconstag-push.sh auto generates the <build_id> portion of the version number from the GitHub MAIN branch commit count
- Create a tag, update the pubspec.yaml update the CHANGELOG to add the new release
bash tag-push.sh --version <major.minor.patch> --force
- Edit the CHANGELOG.md updating the new section to include the changes you want
- Commit the changelog and the pubspec.yaml and push the tags, changelog and pubspec.yaml to the remote server
bash tag-push.sh --version <major.minor.patch> --force --push
In case you need to manually update release tags
- Create a local tag
git tag 1.1.0+1 - Delete a local tag
git tag -d 1.1.0+1 - Push tags to remote
git push origin --tags - Delete a remote tag
git push origin --delete 1.1.0+1- Deleting a remote tag will not work if there is a release tied to the tag
_. Dart _. Flutter _. mardownlint _. Prettier (legacy) - Code formatter
_. AI Tookit for Visual Studio Code _. Dart _. Flutter _. Flutter coverage _. mardownlint _. Markdown All in One _. Makdown Preview Mermaid Support _. Prettier