diff --git a/lib/main.dart b/lib/main.dart index 79102f52..1184d847 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:gearforce/v3/data/data.dart'; -import 'package:gearforce/v3/screens/roster/roster.dart'; +import 'package:gearforce/v3/gearforce_v3.dart'; +import 'package:gearforce/v4/gearforce_v4.dart'; import 'package:gearforce/widgets/roster_id.dart'; import 'package:gearforce/widgets/settings.dart'; import 'package:gearforce/widgets/version_selector.dart'; @@ -15,8 +15,6 @@ Future main() async { final idParam = baseUri.queryParameters['id']; final appInfo = await PackageInfo.fromPlatform(); - final versionSelector = VersionSelector(); - final Settings settings = Settings(); final app = MaterialApp( @@ -29,12 +27,18 @@ Future main() async { primary: Colors.blue, ), ), - initialRoute: '/v3.1', + initialRoute: '/${VersionSelector.defaultSelectedVersion}', routes: { - '/v3.1': (context) => GearForceV3( + '/${VersionSelector.v3_1}': (context) => GearForceV3( + rosterId: RosterId(idParam), + version: appInfo.version, + versionSelector: VersionSelector(VersionSelector.v3_1), + settings: settings, + ), + '/${VersionSelector.v4_0}': (context) => GearForceV4( rosterId: RosterId(idParam), version: appInfo.version, - versionSelector: versionSelector, + versionSelector: VersionSelector(VersionSelector.v4_0), settings: settings, ), }, @@ -47,63 +51,3 @@ Future main() async { child: app, )); } - -class GearForceV3 extends StatefulWidget { - const GearForceV3({ - Key? key, - required this.rosterId, - required this.version, - required this.versionSelector, - required this.settings, - }) : super(key: key); - - final RosterId rosterId; - final String version; - final VersionSelector versionSelector; - final Settings settings; - - @override - _GearForceV3State createState() => _GearForceV3State(); -} - -class _GearForceV3State extends State { - _GearForceV3State(); - - final DataV3 _v3Data = DataV3(); - - @override - void initState() { - super.initState(); - - if (!widget.settings.isInitialized) { - widget.settings.load().then((_) { - _v3Data.load(widget.settings).whenComplete(() { - setState(() {}); - }); - }); - } else { - _v3Data.load(widget.settings).whenComplete(() { - setState(() {}); - }); - } - } - - @override - Widget build(BuildContext context) { - final title = 'Gearforce'; - - return MultiProvider( - providers: [ - Provider(create: (_) => _v3Data), - ], - child: RosterWidget( - title: title, - data: _v3Data, - rosterId: widget.rosterId, - version: widget.version, - settings: widget.settings, - versionSelector: widget.versionSelector, - ), - ); - } -} diff --git a/lib/v3/gearforce_v3.dart b/lib/v3/gearforce_v3.dart new file mode 100644 index 00000000..a164616f --- /dev/null +++ b/lib/v3/gearforce_v3.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:gearforce/v3/data/data.dart'; +import 'package:gearforce/v3/screens/roster/roster.dart'; +import 'package:gearforce/widgets/roster_id.dart'; +import 'package:gearforce/widgets/settings.dart'; +import 'package:gearforce/widgets/version_selector.dart'; +import 'package:provider/provider.dart'; + +class GearForceV3 extends StatefulWidget { + const GearForceV3({ + Key? key, + required this.rosterId, + required this.version, + required this.versionSelector, + required this.settings, + }) : super(key: key); + + final RosterId rosterId; + final String version; + final VersionSelector versionSelector; + final Settings settings; + + @override + _GearForceV3State createState() => _GearForceV3State(); +} + +class _GearForceV3State extends State { + _GearForceV3State(); + + final DataV3 _v3Data = DataV3(); + + @override + void initState() { + super.initState(); + + if (!widget.settings.isInitialized) { + widget.settings.load().then((_) { + _v3Data.load(widget.settings).whenComplete(() { + setState(() {}); + }); + }); + } else { + _v3Data.load(widget.settings).whenComplete(() { + setState(() {}); + }); + } + } + + @override + Widget build(BuildContext context) { + final title = 'Gearforce'; + + return MultiProvider( + providers: [ + Provider(create: (_) => _v3Data), + ], + child: RosterWidget( + title: title, + data: _v3Data, + rosterId: widget.rosterId, + version: widget.version, + settings: widget.settings, + versionSelector: widget.versionSelector, + ), + ); + } +} diff --git a/lib/v3/screens/roster/roster.dart b/lib/v3/screens/roster/roster.dart index 61a530be..80deaa8c 100644 --- a/lib/v3/screens/roster/roster.dart +++ b/lib/v3/screens/roster/roster.dart @@ -16,8 +16,8 @@ import 'package:gearforce/widgets/api/api_service.dart'; import 'package:gearforce/widgets/confirmation_dialog.dart'; import 'package:gearforce/widgets/pdf_settings.dart'; import 'package:gearforce/widgets/roster_id.dart'; +import 'package:gearforce/widgets/roster_title.dart'; import 'package:gearforce/widgets/settings.dart'; -import 'package:gearforce/widgets/version_checker.dart'; import 'package:gearforce/widgets/version_selector.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -87,15 +87,10 @@ class _RosterWidgetState extends State { appBar: AppBar( // Here we take the value from the Roster object that was created by // the App.build method, and use it to set our appbar title. - title: Row( - children: [ - Text(widget.title!), - widget.versionSelector, - Spacer(), - VersionChecker( - currentVersion: widget.version, - ), - ], + title: RosterTitle( + title: widget.title!, + versionSelector: widget.versionSelector, + version: widget.version, ), toolbarHeight: _titleHeight, backgroundColor: Theme.of(context).primaryColor, diff --git a/lib/v4/gearforce_v4.dart b/lib/v4/gearforce_v4.dart new file mode 100644 index 00000000..7cb5e81c --- /dev/null +++ b/lib/v4/gearforce_v4.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:gearforce/widgets/roster_id.dart'; +import 'package:gearforce/widgets/roster_title.dart'; +import 'package:gearforce/widgets/settings.dart'; +import 'package:gearforce/widgets/version_selector.dart'; + +const double _titleHeight = 40.0; + +class GearForceV4 extends StatefulWidget { + const GearForceV4({ + Key? key, + required this.rosterId, + required this.version, + required this.versionSelector, + required this.settings, + }) : super(key: key); + + final RosterId rosterId; + final String version; + final VersionSelector versionSelector; + final Settings settings; + + @override + _GearForceV4State createState() => _GearForceV4State(); +} + +class _GearForceV4State extends State { + _GearForceV4State(); + + @override + void initState() { + super.initState(); + + _loadSettings(); + } + + void _loadSettings() async { + if (!widget.settings.isInitialized) { + await widget.settings.load(); + } + } + + @override + Widget build(BuildContext context) { + final title = 'Gearforce'; + + final roster = RosterTitle( + title: title, + versionSelector: widget.versionSelector, + version: widget.version, + ); + + return Scaffold( + appBar: AppBar( + title: roster, + toolbarHeight: _titleHeight, + backgroundColor: Theme.of(context).primaryColor, + ), + body: Center( + child: Text('Gearforce V4'), + ), + ); + } +} diff --git a/lib/widgets/roster_title.dart b/lib/widgets/roster_title.dart new file mode 100644 index 00000000..9f702f91 --- /dev/null +++ b/lib/widgets/roster_title.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:gearforce/widgets/version_checker.dart'; +import 'package:gearforce/widgets/version_selector.dart'; + +class RosterTitle extends StatelessWidget { + const RosterTitle({ + super.key, + required this.title, + required this.versionSelector, + required this.version, + }); + + final String title; + final VersionSelector versionSelector; + final String version; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Text(title), + versionSelector, + Spacer(), + VersionChecker( + currentVersion: version, + ), + ], + ); + } +} diff --git a/lib/widgets/version_selector.dart b/lib/widgets/version_selector.dart index e1378061..3d5daee5 100644 --- a/lib/widgets/version_selector.dart +++ b/lib/widgets/version_selector.dart @@ -1,15 +1,20 @@ import 'package:flutter/material.dart'; -class VersionSelector extends StatefulWidget { - const VersionSelector(); +const String _3_1 = 'v3.1'; +const String _4_0 = 'v4.0'; - @override - _VersionSelectorState createState() => _VersionSelectorState(); -} +class VersionSelector extends StatelessWidget { + VersionSelector(this.currentVersion); + + static final String defaultSelectedVersion = _3_1; + static String get v3_1 => _3_1; + static String get v4_0 => _4_0; -class _VersionSelectorState extends State { - String _currentSelectedVersion = 'v3.1'; - final versions = ['v3.1'] + //final versions = const [_3_1, _4_0]; + final versions = const [_3_1]; + final String currentVersion; + + late final versionsDropdown = versions .map((String value) => DropdownMenuItem( value: value, child: Text(value), @@ -21,20 +26,17 @@ class _VersionSelectorState extends State { return Padding( padding: const EdgeInsets.only(left: 15.0), child: DropdownButton( - value: _currentSelectedVersion, - items: versions, + value: currentVersion, + items: versionsDropdown, onChanged: (String? value) { if (value == null) { return; } - setState(() { - if (_currentSelectedVersion == value) { - return; - } - _currentSelectedVersion = value; - Navigator.pushNamed(context, '/${value}'); - }); + if (!versions.contains(value)) { + return; + } + Navigator.pushReplacementNamed(context, '/${value}'); }, ), ); diff --git a/pubspec.yaml b/pubspec.yaml index edfd2d92..ccd41ae7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.16.0 +version: 1.16.1 environment: sdk: ">=3.0.0"