diff --git a/CHANGELOG.md b/CHANGELOG.md
index fc18fd7..747ffea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,7 @@
## 1.2.0
- Add `PAL` to list of known sets
- Add support for PTCGL tokens
-- Update included API docs in packages directory
+- Update included API docs directory
## 1.1.0
- Feedback via snackbar now provided on save
diff --git a/doc/api/__404error.html b/doc/api/__404error.html
new file mode 100644
index 0000000..9c018d7
--- /dev/null
+++ b/doc/api/__404error.html
@@ -0,0 +1,125 @@
+
+
+
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
const aboutText = Text(
+ "CastFORM is a free and easy to use tool for automatic filling out of Pokemon "
+ "tournament registration sheets!\n"
+ "\n"
+ "Put together with love from Brandon Nguyen and Amos Chua of BAA Studios!\n"
+ "If you enjoy our work, do follow us on GitHub; if you're feeling generous, you can "
+ "buy us a coffee on ko-fi too!"
+);
+ Text("CastFORM is a free and easy to use tool for automatic filling out of Pokemon " "tournament registration sheets!\n" "\n" "Put together with love from Brandon Ng…
+
This project is based on Brandon Nguyen's CLI Python script that served a similar purpose. CastFORM was spearheaded in response to the high demand for a user-friendly program in his local TCG community, most of whom were not comfortable with CLI tools.
+
Gallery
+
Light mode:
+
+
Dark mode
+
+
Installation & Usage Instructions
+
Note: Only 64-bit Windows 11 machines are officially supported.
+
ZIP Archive
+
+
Download castform.zip from the releases page
+
+
Note: actual file name may vary
+
+
+
Unzip it into your desired install location
+
Run CastFORM.exe from that location
+
+
Windows Installer
+
+
Download CastFORM_x64.exe from the releases page
+
Run it as administrator to install CastFORM to C:\Program Files\CastFORM
+
Run CastFORM.exe from C:\Program Files\CastFORM\CastFORM.exe, and/or create a shortcut for it
CastFORM is built with Flutter 3.7.8 for 64-bit Windows 11, and targets Google's Dart style guide.
+For testing, we aim to provide complete coverage for API behaviour internally by release.
You may use your IDE of choice, but we prefer IntelliJ here at BAA Studios
+
Make sure you install the Dart and Flutter Plugin for IntelliJ
+
+
+
Make sure Windows (desktop) is selected in the list of devices
+
+
The location of the button differs depending on IntelliJ version
+
For IntelliJ 2022.3 use the drop-down menu at the top right:
+
+
+
+
Hit the Run button at the top right of the window
+
+
The location of the button differs depending on IntelliJ version
+
For IntelliJ 2022.3 click here:
+
+
+
+
+
Internal Package API
+
API docs for the business logic are included as static HTML files in the repository.
+After cloning the repository, navigate to the respective package to open them:
+
+
packages/deck_string_parser/doc/api/index.html
+
packages/pokemon_pdf_builder/doc/api/index.html
+
+
Build Instructions
+
+
Run flutter build windows
+
Navigate to the output folder /build/windows/runner/Release
+
Add the following dlls (which can be found in a Visual Studio 2022 installation folder, e.g. C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.32.31326\x64\Microsoft.VC143.CRT)
+
+
msvcp140.dll
+
vcruntime140.dll
+
vcruntime140_1.dll
+
+
+
Package the contents of this folder as a ZIP file
+
+
Users can unzip to their desired location and run CastFORM.exe from there
+
+
+
+
Bundle with Windows Installer (Optional)
+
Note: This assumes you've already run through steps 1-4 of the build instructions
+First time bundling:
+
+
Add a batch script setup.bat (refer to /sample_setup.bat for template)
+
Run iexpress.exe as administrator
+
Select Create new Self Extraction Directive file, and hit Next
+
Select Extract files and run an installation command, and hit Next
+
Input a title (e.g. CastFORM Installer), and hit Next
+
Select No prompt, and hit Next
+
Select Do not display a license, and hit Next
+
Use the Add button to add all the files in the output folder from above, and hit Next
+
+
The file picker dialog box allows CTRL + A to select all files
+
The file picker dialog box ignores folders, and does not add them recursively
+
You may use CTRL + A on the output folder and repeat for all nested folders to quickly add everything
+
+
+
In the Install Program field, click on it and manually replace with cmd /c setup.bat, and hit Next
+
+
You are able to type in this drop down box
+
The cmd /c part is REQUIRED
+
IExpress simply bundles/extracts as well as wrap around a batch script, so all installation logic should be written in setup.bat
+
+
+
Select Default, and hit Next
+
Input a message if you like, and hit Next
+
Click Browse and select an output folder for the resulting installer EXE, and give it a name
+
Check Store files using Long File Name inside Package, and hit Next
+
Select No restart, and hit Next
+
Select Save Self Extraction Directive (SED) file, and use Browse to choose a save location, then hit Next
+
+
The SED file contains all the configuration you've done up to this point
+
Importing this file will allow you to reuse the same configuration for future bundling attempts
+
+
+
On the Create package page, hit Next to start the bundling process, and then Finish once it's done
+
+
For subsequent bundling:
+
+
Run iexpress.exe as administrator
+
Select Open existing Self Extraction Directive file, and select the SED file with Browse
+
Select Create Package
+
On the Create package page, hit Next to start the bundling process, and then Finish once it's done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/index.json b/doc/api/index.json
new file mode 100644
index 0000000..95cbe8f
--- /dev/null
+++ b/doc/api/index.json
@@ -0,0 +1 @@
+[{"name":"app","qualifiedName":"app","href":"app/app-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"App","qualifiedName":"app.App","href":"app/App-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"app","type":"library","href":"app/app-library.html"}},{"name":"App","qualifiedName":"app.App.App","href":"app/App/App.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"App","type":"class","href":"app/App-class.html"}},{"name":"build","qualifiedName":"app.App.build","href":"app/App/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"App","type":"class","href":"app/App-class.html"}},{"name":"buttons","qualifiedName":"buttons","href":"screens_buttons/screens_buttons-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"AboutButton","qualifiedName":"buttons.AboutButton","href":"screens_buttons/AboutButton-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"buttons","type":"library","href":"screens_buttons/screens_buttons-library.html"}},{"name":"AboutButton","qualifiedName":"buttons.AboutButton.AboutButton","href":"screens_buttons/AboutButton/AboutButton.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"AboutButton","type":"class","href":"screens_buttons/AboutButton-class.html"}},{"name":"build","qualifiedName":"buttons.AboutButton.build","href":"screens_buttons/AboutButton/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"AboutButton","type":"class","href":"screens_buttons/AboutButton-class.html"}},{"name":"SaveButton","qualifiedName":"buttons.SaveButton","href":"screens_buttons/SaveButton-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"buttons","type":"library","href":"screens_buttons/screens_buttons-library.html"}},{"name":"SaveButton","qualifiedName":"buttons.SaveButton.SaveButton","href":"screens_buttons/SaveButton/SaveButton.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"SaveButton","type":"class","href":"screens_buttons/SaveButton-class.html"}},{"name":"build","qualifiedName":"buttons.SaveButton.build","href":"screens_buttons/SaveButton/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"SaveButton","type":"class","href":"screens_buttons/SaveButton-class.html"}},{"name":"formKey","qualifiedName":"buttons.SaveButton.formKey","href":"screens_buttons/SaveButton/formKey.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"SaveButton","type":"class","href":"screens_buttons/SaveButton-class.html"}},{"name":"constants","qualifiedName":"constants","href":"constants/constants-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"PaperType","qualifiedName":"constants.PaperType","href":"constants/PaperType.html","type":"enum","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"PaperType","qualifiedName":"constants.PaperType.PaperType","href":"constants/PaperType/PaperType.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"PaperType","type":"enum","href":"constants/PaperType.html"}},{"name":"values","qualifiedName":"constants.PaperType.values","href":"constants/PaperType/values-constant.html","type":"constant","overriddenDepth":0,"packageName":"castform","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"PaperType","type":"enum","href":"constants/PaperType.html"}},{"name":"aboutText","qualifiedName":"constants.aboutText","href":"constants/aboutText-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"appName","qualifiedName":"constants.appName","href":"constants/appName.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"appVersion","qualifiedName":"constants.appVersion","href":"constants/appVersion.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"defaultBorder","qualifiedName":"constants.defaultBorder","href":"constants/defaultBorder-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"defaultPadding","qualifiedName":"constants.defaultPadding","href":"constants/defaultPadding-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"formTemplate","qualifiedName":"constants.formTemplate","href":"constants/formTemplate.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"formTextStyle","qualifiedName":"constants.formTextStyle","href":"constants/formTextStyle.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"initPackageInfo","qualifiedName":"constants.initPackageInfo","href":"constants/initPackageInfo.html","type":"function","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"initPdfConstants","qualifiedName":"constants.initPdfConstants","href":"constants/initPdfConstants.html","type":"function","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"maximumHumanLifespan","qualifiedName":"constants.maximumHumanLifespan","href":"constants/maximumHumanLifespan-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants/constants-library.html"}},{"name":"date_field","qualifiedName":"date_field","href":"screens_date_field/screens_date_field-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"DateField","qualifiedName":"date_field.DateField","href":"screens_date_field/DateField-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"date_field","type":"library","href":"screens_date_field/screens_date_field-library.html"}},{"name":"DateField","qualifiedName":"date_field.DateField.DateField","href":"screens_date_field/DateField/DateField.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"DateField","type":"class","href":"screens_date_field/DateField-class.html"}},{"name":"createState","qualifiedName":"date_field.DateField.createState","href":"screens_date_field/DateField/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"DateField","type":"class","href":"screens_date_field/DateField-class.html"}},{"name":"deck_field","qualifiedName":"deck_field","href":"screens_deck_field/screens_deck_field-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"DeckField","qualifiedName":"deck_field.DeckField","href":"screens_deck_field/DeckField-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"deck_field","type":"library","href":"screens_deck_field/screens_deck_field-library.html"}},{"name":"DeckField","qualifiedName":"deck_field.DeckField.DeckField","href":"screens_deck_field/DeckField/DeckField.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"DeckField","type":"class","href":"screens_deck_field/DeckField-class.html"}},{"name":"createState","qualifiedName":"deck_field.DeckField.createState","href":"screens_deck_field/DeckField/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"DeckField","type":"class","href":"screens_deck_field/DeckField-class.html"}},{"name":"document","qualifiedName":"document","href":"screens_document/screens_document-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"Document","qualifiedName":"document.Document","href":"screens_document/Document-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"document","type":"library","href":"screens_document/screens_document-library.html"}},{"name":"Document","qualifiedName":"document.Document.Document","href":"screens_document/Document/Document.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"Document","type":"class","href":"screens_document/Document-class.html"}},{"name":"createState","qualifiedName":"document.Document.createState","href":"screens_document/Document/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"Document","type":"class","href":"screens_document/Document-class.html"}},{"name":"form_column","qualifiedName":"form_column","href":"screens_form_column/screens_form_column-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"FormColumn","qualifiedName":"form_column.FormColumn","href":"screens_form_column/FormColumn-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"form_column","type":"library","href":"screens_form_column/screens_form_column-library.html"}},{"name":"FormColumn","qualifiedName":"form_column.FormColumn.FormColumn","href":"screens_form_column/FormColumn/FormColumn.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"FormColumn","type":"class","href":"screens_form_column/FormColumn-class.html"}},{"name":"createState","qualifiedName":"form_column.FormColumn.createState","href":"screens_form_column/FormColumn/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"FormColumn","type":"class","href":"screens_form_column/FormColumn-class.html"}},{"name":"home_material","qualifiedName":"home_material","href":"screens_home_material/screens_home_material-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"AndroidScreen","qualifiedName":"home_material.AndroidScreen","href":"screens_home_material/AndroidScreen-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"home_material","type":"library","href":"screens_home_material/screens_home_material-library.html"}},{"name":"AndroidScreen","qualifiedName":"home_material.AndroidScreen.AndroidScreen","href":"screens_home_material/AndroidScreen/AndroidScreen.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"AndroidScreen","type":"class","href":"screens_home_material/AndroidScreen-class.html"}},{"name":"build","qualifiedName":"home_material.AndroidScreen.build","href":"screens_home_material/AndroidScreen/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"AndroidScreen","type":"class","href":"screens_home_material/AndroidScreen-class.html"}},{"name":"HomeMaterial","qualifiedName":"home_material.HomeMaterial","href":"screens_home_material/HomeMaterial-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"Holds the UI layout for the home page, with Material design","enclosedBy":{"name":"home_material","type":"library","href":"screens_home_material/screens_home_material-library.html"}},{"name":"HomeMaterial","qualifiedName":"home_material.HomeMaterial.HomeMaterial","href":"screens_home_material/HomeMaterial/HomeMaterial.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"HomeMaterial","type":"class","href":"screens_home_material/HomeMaterial-class.html"}},{"name":"createState","qualifiedName":"home_material.HomeMaterial.createState","href":"screens_home_material/HomeMaterial/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"HomeMaterial","type":"class","href":"screens_home_material/HomeMaterial-class.html"}},{"name":"WindowsScreen","qualifiedName":"home_material.WindowsScreen","href":"screens_home_material/WindowsScreen-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"home_material","type":"library","href":"screens_home_material/screens_home_material-library.html"}},{"name":"WindowsScreen","qualifiedName":"home_material.WindowsScreen.WindowsScreen","href":"screens_home_material/WindowsScreen/WindowsScreen.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"WindowsScreen","type":"class","href":"screens_home_material/WindowsScreen-class.html"}},{"name":"build","qualifiedName":"home_material.WindowsScreen.build","href":"screens_home_material/WindowsScreen/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"WindowsScreen","type":"class","href":"screens_home_material/WindowsScreen-class.html"}},{"name":"getHomeScreen","qualifiedName":"home_material.getHomeScreen","href":"screens_home_material/getHomeScreen.html","type":"function","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"home_material","type":"library","href":"screens_home_material/screens_home_material-library.html"}},{"name":"id_field","qualifiedName":"id_field","href":"screens_id_field/screens_id_field-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"IdField","qualifiedName":"id_field.IdField","href":"screens_id_field/IdField-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"id_field","type":"library","href":"screens_id_field/screens_id_field-library.html"}},{"name":"IdField","qualifiedName":"id_field.IdField.IdField","href":"screens_id_field/IdField/IdField.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"IdField","type":"class","href":"screens_id_field/IdField-class.html"}},{"name":"createState","qualifiedName":"id_field.IdField.createState","href":"screens_id_field/IdField/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"IdField","type":"class","href":"screens_id_field/IdField-class.html"}},{"name":"main","qualifiedName":"main","href":"main/main-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"main","qualifiedName":"main.main","href":"main/main.html","type":"function","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"main","type":"library","href":"main/main-library.html"}},{"name":"name_field","qualifiedName":"name_field","href":"screens_name_field/screens_name_field-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"NameField","qualifiedName":"name_field.NameField","href":"screens_name_field/NameField-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"name_field","type":"library","href":"screens_name_field/screens_name_field-library.html"}},{"name":"NameField","qualifiedName":"name_field.NameField.NameField","href":"screens_name_field/NameField/NameField.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"NameField","type":"class","href":"screens_name_field/NameField-class.html"}},{"name":"createState","qualifiedName":"name_field.NameField.createState","href":"screens_name_field/NameField/createState.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"NameField","type":"class","href":"screens_name_field/NameField-class.html"}},{"name":"open_file","qualifiedName":"open_file","href":"screens_open_file/screens_open_file-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"OpenFileOnSave","qualifiedName":"open_file.OpenFileOnSave","href":"screens_open_file/OpenFileOnSave-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"open_file","type":"library","href":"screens_open_file/screens_open_file-library.html"}},{"name":"OpenFileOnSave","qualifiedName":"open_file.OpenFileOnSave.OpenFileOnSave","href":"screens_open_file/OpenFileOnSave/OpenFileOnSave.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"OpenFileOnSave","type":"class","href":"screens_open_file/OpenFileOnSave-class.html"}},{"name":"build","qualifiedName":"open_file.OpenFileOnSave.build","href":"screens_open_file/OpenFileOnSave/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"OpenFileOnSave","type":"class","href":"screens_open_file/OpenFileOnSave-class.html"}},{"name":"open_in_explorer","qualifiedName":"open_in_explorer","href":"screens_open_in_explorer/screens_open_in_explorer-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"OpenInExplorer","qualifiedName":"open_in_explorer.OpenInExplorer","href":"screens_open_in_explorer/OpenInExplorer-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"open_in_explorer","type":"library","href":"screens_open_in_explorer/screens_open_in_explorer-library.html"}},{"name":"OpenInExplorer","qualifiedName":"open_in_explorer.OpenInExplorer.OpenInExplorer","href":"screens_open_in_explorer/OpenInExplorer/OpenInExplorer.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"OpenInExplorer","type":"class","href":"screens_open_in_explorer/OpenInExplorer-class.html"}},{"name":"build","qualifiedName":"open_in_explorer.OpenInExplorer.build","href":"screens_open_in_explorer/OpenInExplorer/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"OpenInExplorer","type":"class","href":"screens_open_in_explorer/OpenInExplorer-class.html"}},{"name":"paper_size_radios","qualifiedName":"paper_size_radios","href":"screens_paper_size_radios/screens_paper_size_radios-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"A4Radio","qualifiedName":"paper_size_radios.A4Radio","href":"screens_paper_size_radios/A4Radio-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"paper_size_radios","type":"library","href":"screens_paper_size_radios/screens_paper_size_radios-library.html"}},{"name":"A4Radio","qualifiedName":"paper_size_radios.A4Radio.A4Radio","href":"screens_paper_size_radios/A4Radio/A4Radio.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"A4Radio","type":"class","href":"screens_paper_size_radios/A4Radio-class.html"}},{"name":"build","qualifiedName":"paper_size_radios.A4Radio.build","href":"screens_paper_size_radios/A4Radio/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"A4Radio","type":"class","href":"screens_paper_size_radios/A4Radio-class.html"}},{"name":"LetterRadio","qualifiedName":"paper_size_radios.LetterRadio","href":"screens_paper_size_radios/LetterRadio-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"paper_size_radios","type":"library","href":"screens_paper_size_radios/screens_paper_size_radios-library.html"}},{"name":"LetterRadio","qualifiedName":"paper_size_radios.LetterRadio.LetterRadio","href":"screens_paper_size_radios/LetterRadio/LetterRadio.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"LetterRadio","type":"class","href":"screens_paper_size_radios/LetterRadio-class.html"}},{"name":"build","qualifiedName":"paper_size_radios.LetterRadio.build","href":"screens_paper_size_radios/LetterRadio/build.html","type":"method","overriddenDepth":1,"packageName":"castform","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"LetterRadio","type":"class","href":"screens_paper_size_radios/LetterRadio-class.html"}},{"name":"save_feedback","qualifiedName":"save_feedback","href":"models_save_feedback/models_save_feedback-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"SaveResponse","qualifiedName":"save_feedback.SaveResponse","href":"models_save_feedback/SaveResponse-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"Models the feedback to the user after the save button is clicked","enclosedBy":{"name":"save_feedback","type":"library","href":"models_save_feedback/models_save_feedback-library.html"}},{"name":"SaveResponse","qualifiedName":"save_feedback.SaveResponse.SaveResponse","href":"models_save_feedback/SaveResponse/SaveResponse.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"SaveResponse","type":"class","href":"models_save_feedback/SaveResponse-class.html"}},{"name":"isError","qualifiedName":"save_feedback.SaveResponse.isError","href":"models_save_feedback/SaveResponse/isError.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"SaveResponse","type":"class","href":"models_save_feedback/SaveResponse-class.html"}},{"name":"notificationText","qualifiedName":"save_feedback.SaveResponse.notificationText","href":"models_save_feedback/SaveResponse/notificationText.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"SaveResponse","type":"class","href":"models_save_feedback/SaveResponse-class.html"}},{"name":"notifyAfterSave","qualifiedName":"save_feedback.SaveResponse.notifyAfterSave","href":"models_save_feedback/SaveResponse/notifyAfterSave.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"Returns a appropriate snackbar when forms are saved","enclosedBy":{"name":"SaveResponse","type":"class","href":"models_save_feedback/SaveResponse-class.html"}},{"name":"style","qualifiedName":"style","href":"style/style-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"darkTheme","qualifiedName":"style.darkTheme","href":"style/darkTheme.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"style","type":"library","href":"style/style-library.html"}},{"name":"defaultFontName","qualifiedName":"style.defaultFontName","href":"style/defaultFontName.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"style","type":"library","href":"style/style-library.html"}},{"name":"defaultFontWeight","qualifiedName":"style.defaultFontWeight","href":"style/defaultFontWeight-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"style","type":"library","href":"style/style-library.html"}},{"name":"labelTextSize","qualifiedName":"style.labelTextSize","href":"style/labelTextSize-constant.html","type":"top-level constant","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"style","type":"library","href":"style/style-library.html"}},{"name":"theme","qualifiedName":"style.theme","href":"style/theme.html","type":"top-level property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"style","type":"library","href":"style/style-library.html"}},{"name":"user","qualifiedName":"user","href":"models_user/models_user-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"User","qualifiedName":"user.User","href":"models_user/User-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"user","type":"library","href":"models_user/models_user-library.html"}},{"name":"User","qualifiedName":"user.User.User","href":"models_user/User/User.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"dateOfBirth","qualifiedName":"user.User.dateOfBirth","href":"models_user/User/dateOfBirth.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"deckString","qualifiedName":"user.User.deckString","href":"models_user/User/deckString.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"isA4","qualifiedName":"user.User.isA4","href":"models_user/User/isA4.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"openInExplorer","qualifiedName":"user.User.openInExplorer","href":"models_user/User/openInExplorer.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"openInViewer","qualifiedName":"user.User.openInViewer","href":"models_user/User/openInViewer.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"paperType","qualifiedName":"user.User.paperType","href":"models_user/User/paperType.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"playerId","qualifiedName":"user.User.playerId","href":"models_user/User/playerId.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"playerName","qualifiedName":"user.User.playerName","href":"models_user/User/playerName.html","type":"property","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"save","qualifiedName":"user.User.save","href":"models_user/User/save.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"Attempts to save the input data as PDF","enclosedBy":{"name":"User","type":"class","href":"models_user/User-class.html"}},{"name":"user_provider","qualifiedName":"user_provider","href":"providers_user_provider/providers_user_provider-library.html","type":"library","overriddenDepth":0,"packageName":"castform","desc":""},{"name":"UserProvider","qualifiedName":"user_provider.UserProvider","href":"providers_user_provider/UserProvider-class.html","type":"class","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"user_provider","type":"library","href":"providers_user_provider/providers_user_provider-library.html"}},{"name":"UserProvider","qualifiedName":"user_provider.UserProvider.UserProvider","href":"providers_user_provider/UserProvider/UserProvider.html","type":"constructor","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"setDate","qualifiedName":"user_provider.UserProvider.setDate","href":"providers_user_provider/UserProvider/setDate.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"setDeckString","qualifiedName":"user_provider.UserProvider.setDeckString","href":"providers_user_provider/UserProvider/setDeckString.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"setId","qualifiedName":"user_provider.UserProvider.setId","href":"providers_user_provider/UserProvider/setId.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"setName","qualifiedName":"user_provider.UserProvider.setName","href":"providers_user_provider/UserProvider/setName.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"setPaperType","qualifiedName":"user_provider.UserProvider.setPaperType","href":"providers_user_provider/UserProvider/setPaperType.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"toggleOpenFile","qualifiedName":"user_provider.UserProvider.toggleOpenFile","href":"providers_user_provider/UserProvider/toggleOpenFile.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}},{"name":"toggleOpenInExplorer","qualifiedName":"user_provider.UserProvider.toggleOpenInExplorer","href":"providers_user_provider/UserProvider/toggleOpenInExplorer.html","type":"method","overriddenDepth":0,"packageName":"castform","desc":"","enclosedBy":{"name":"UserProvider","type":"class","href":"providers_user_provider/UserProvider-class.html"}}]
diff --git a/doc/api/main/main-library.html b/doc/api/main/main-library.html
new file mode 100644
index 0000000..e59bd2e
--- /dev/null
+++ b/doc/api/main/main-library.html
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+ main library - Dart API
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ menu
+
+
+ Discards any resources used by the object. After this is called, the
+object is not in a usable state and should be discarded (calls to
+addListener will throw after the object is disposed).
+
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
StatelessWidget getHomeScreen() {
+ if (Platform.isWindows || Platform.isLinux) {
+ return const WindowsScreen();
+ }
+ if (Platform.isAndroid) {
+ return const AndroidScreen();
+ }
+ throw UnsupportedError("This app is only intended to run on Windows, Ubuntu, or Android");
+}
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
The framework can call this method multiple times over the lifetime of
+a StatefulWidget. For example, if the widget is inserted into the tree
+in multiple locations, the framework will create a separate State object
+for each location. Similarly, if the widget is removed from the tree and
+later inserted into the tree again, the framework will call createState
+again to create a fresh State object, simplifying the lifecycle of
+State objects.
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and
Describes the part of the user interface represented by this widget.
+
The framework calls this method when this widget is inserted into the tree
+in a given BuildContext and when the dependencies of this widget change
+(e.g., an InheritedWidget referenced by this widget changes). This
+method can potentially be called in every frame and should not have any side
+effects beyond building a widget.
+
The framework replaces the subtree below this widget with the widget
+returned by this method, either by updating the existing subtree or by
+removing the subtree and inflating a new subtree, depending on whether the
+widget returned by this method can update the root of the existing
+subtree, as determined by calling Widget.canUpdate.
+
Typically implementations return a newly created constellation of widgets
+that are configured with information from this widget's constructor and
+from the given BuildContext.
+
The given BuildContext contains information about the location in the
+tree at which this widget is being built. For example, the context
+provides the set of inherited widgets for this location in the tree. A
+given widget might be built with multiple different BuildContext
+arguments over time if the widget is moved around the tree or if the
+widget is inserted into the tree in multiple places at once.
+
The implementation of this method must only depend on:
+
+
the fields of the widget, which themselves must not change over time,
+and