diff --git a/analysis_options.yaml b/analysis_options.yaml index 39d63410..11ccd2ae 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -9,6 +9,10 @@ # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml +analyzer: + exclude: + - lib/generated_plugin_registrant.dart + linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` diff --git a/lib/logic/cubit/forms/validations/validations.dart b/lib/logic/cubit/forms/validations/validations.dart index b7d054d0..800ca77b 100644 --- a/lib/logic/cubit/forms/validations/validations.dart +++ b/lib/logic/cubit/forms/validations/validations.dart @@ -6,10 +6,10 @@ abstract class LengthStringValidation extends ValidationModel { : super(predicate, errorMessage); @override - String? check(String value) { - var length = value.length; + String? check(String val) { + var length = val.length; var errorMessage = errorMassage.replaceAll('[]', length.toString()); - return test(value) ? errorMessage : null; + return test(val) ? errorMessage : null; } } diff --git a/lib/main.dart b/lib/main.dart index 6e3d181b..9593ee31 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,7 @@ import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/theming/factory/app_theme_factory.dart'; import 'package:selfprivacy/ui/pages/setup/initializing.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; -import 'package:selfprivacy/ui/pages/rootRoute.dart'; +import 'package:selfprivacy/ui/pages/root_route.dart'; import 'package:wakelock/wakelock.dart'; import 'package:timezone/data/latest.dart' as tz; @@ -55,9 +55,10 @@ void main() async { class MyApp extends StatelessWidget { const MyApp({ + Key? key, required this.lightThemeData, required this.darkThemeData, - }); + }) : super(key: key); final ThemeData lightThemeData; final ThemeData darkThemeData; @@ -84,7 +85,7 @@ class MyApp extends StatelessWidget { themeMode: appSettings.isDarkModeOn ? ThemeMode.dark : ThemeMode.light, home: appSettings.isOnboardingShowing - ? OnboardingPage(nextPage: InitializingPage()) + ? const OnboardingPage(nextPage: InitializingPage()) : const RootPage(), builder: (BuildContext context, Widget? widget) { Widget error = const Text('...rendering error...'); diff --git a/lib/ui/components/brand_button/brand_button.dart b/lib/ui/components/brand_button/brand_button.dart index 398e9cc2..186056c0 100644 --- a/lib/ui/components/brand_button/brand_button.dart +++ b/lib/ui/components/brand_button/brand_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:selfprivacy/ui/components/brand_button/FilledButton.dart'; +import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; enum BrandButtonTypes { rised, text, iconText } diff --git a/lib/ui/components/brand_md/brand_md.dart b/lib/ui/components/brand_md/brand_md.dart index f2895cff..24c7c860 100644 --- a/lib/ui/components/brand_md/brand_md.dart +++ b/lib/ui/components/brand_md/brand_md.dart @@ -15,7 +15,7 @@ class BrandMarkdown extends StatefulWidget { final String fileName; @override - _BrandMarkdownState createState() => _BrandMarkdownState(); + State createState() => _BrandMarkdownState(); } class _BrandMarkdownState extends State { diff --git a/lib/ui/components/brand_tab_bar/brand_tab_bar.dart b/lib/ui/components/brand_tab_bar/brand_tab_bar.dart index 021c75e0..0c32fd5f 100644 --- a/lib/ui/components/brand_tab_bar/brand_tab_bar.dart +++ b/lib/ui/components/brand_tab_bar/brand_tab_bar.dart @@ -7,7 +7,7 @@ class BrandTabBar extends StatefulWidget { final TabController? controller; @override - _BrandTabBarState createState() => _BrandTabBarState(); + State createState() => _BrandTabBarState(); } class _BrandTabBarState extends State { diff --git a/lib/ui/components/brand_timer/brand_timer.dart b/lib/ui/components/brand_timer/brand_timer.dart index 2e93d415..2aa75bce 100644 --- a/lib/ui/components/brand_timer/brand_timer.dart +++ b/lib/ui/components/brand_timer/brand_timer.dart @@ -16,7 +16,7 @@ class BrandTimer extends StatefulWidget { final Duration duration; @override - _BrandTimerState createState() => _BrandTimerState(); + State createState() => _BrandTimerState(); } class _BrandTimerState extends State { diff --git a/lib/ui/components/icon_status_mask/icon_status_mask.dart b/lib/ui/components/icon_status_mask/icon_status_mask.dart index 89426968..c1f3b80c 100644 --- a/lib/ui/components/icon_status_mask/icon_status_mask.dart +++ b/lib/ui/components/icon_status_mask/icon_status_mask.dart @@ -3,7 +3,11 @@ import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/logic/models/state_types.dart'; class IconStatusMask extends StatelessWidget { - const IconStatusMask({required this.child, required this.status}); + const IconStatusMask({ + Key? key, + required this.child, + required this.status, + }) : super(key: key); final Icon child; final StateType status; diff --git a/lib/ui/components/not_ready_card/not_ready_card.dart b/lib/ui/components/not_ready_card/not_ready_card.dart index 8bc3ec32..8fad8dd6 100644 --- a/lib/ui/components/not_ready_card/not_ready_card.dart +++ b/lib/ui/components/not_ready_card/not_ready_card.dart @@ -27,7 +27,7 @@ class NotReadyCard extends StatelessWidget { child: GestureDetector( onTap: () => Navigator.of(context).push( materialRoute( - InitializingPage(), + const InitializingPage(), ), ), child: Text( diff --git a/lib/ui/components/pre_styled_buttons/flash_fab.dart b/lib/ui/components/pre_styled_buttons/flash_fab.dart index fac36a37..733541c0 100644 --- a/lib/ui/components/pre_styled_buttons/flash_fab.dart +++ b/lib/ui/components/pre_styled_buttons/flash_fab.dart @@ -11,7 +11,7 @@ class BrandFab extends StatefulWidget { const BrandFab({Key? key}) : super(key: key); @override - _BrandFabState createState() => _BrandFabState(); + State createState() => _BrandFabState(); } class _BrandFabState extends State diff --git a/lib/ui/components/progress_bar/progress_bar.dart b/lib/ui/components/progress_bar/progress_bar.dart index 393fcc70..4dfc10af 100644 --- a/lib/ui/components/progress_bar/progress_bar.dart +++ b/lib/ui/components/progress_bar/progress_bar.dart @@ -17,7 +17,7 @@ class ProgressBar extends StatefulWidget { final List steps; @override - _ProgressBarState createState() => _ProgressBarState(); + State createState() => _ProgressBarState(); } class _ProgressBarState extends State { diff --git a/lib/ui/pages/backup_details/backup_details.dart b/lib/ui/pages/backup_details/backup_details.dart index 78d45a5b..d36238da 100644 --- a/lib/ui/pages/backup_details/backup_details.dart +++ b/lib/ui/pages/backup_details/backup_details.dart @@ -21,7 +21,7 @@ class BackupDetails extends StatefulWidget { const BackupDetails({Key? key}) : super(key: key); @override - _BackupDetailsState createState() => _BackupDetailsState(); + State createState() => _BackupDetailsState(); } class _BackupDetailsState extends State diff --git a/lib/ui/pages/dns_details/dns_details.dart b/lib/ui/pages/dns_details/dns_details.dart index b93de2f9..b891c4d1 100644 --- a/lib/ui/pages/dns_details/dns_details.dart +++ b/lib/ui/pages/dns_details/dns_details.dart @@ -8,8 +8,10 @@ import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.da import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; class DnsDetailsPage extends StatefulWidget { + const DnsDetailsPage({Key? key}) : super(key: key); + @override - _DnsDetailsPageState createState() => _DnsDetailsPageState(); + State createState() => _DnsDetailsPageState(); } class _DnsDetailsPageState extends State { diff --git a/lib/ui/pages/more/app_settings/app_setting.dart b/lib/ui/pages/more/app_settings/app_setting.dart index f490bc11..ac4cbc49 100644 --- a/lib/ui/pages/more/app_settings/app_setting.dart +++ b/lib/ui/pages/more/app_settings/app_setting.dart @@ -16,7 +16,7 @@ class AppSettingsPage extends StatefulWidget { const AppSettingsPage({Key? key}) : super(key: key); @override - _AppSettingsPageState createState() => _AppSettingsPageState(); + State createState() => _AppSettingsPageState(); } class _AppSettingsPageState extends State { @@ -50,6 +50,7 @@ class _AppSettingsPageState extends State { child: _TextColumn( title: 'more.settings.1'.tr(), value: 'more.settings.2'.tr(), + hasWarning: false, ), ), const SizedBox(width: 5), @@ -76,6 +77,7 @@ class _AppSettingsPageState extends State { child: _TextColumn( title: 'more.settings.3'.tr(), value: 'more.settings.4'.tr(), + hasWarning: false, ), ), const SizedBox(width: 5), @@ -144,6 +146,7 @@ class _AppSettingsPageState extends State { child: _TextColumn( title: 'more.settings.5'.tr(), value: 'more.settings.6'.tr(), + hasWarning: false, ), ), const SizedBox(width: 5), @@ -177,6 +180,7 @@ class _AppSettingsPageState extends State { await context .read() .serverDelete(); + if (!mounted) return; Navigator.of(context).pop(); }), ActionButton( diff --git a/lib/ui/pages/more/console/console.dart b/lib/ui/pages/more/console/console.dart index 984f20b3..1c77e6bf 100644 --- a/lib/ui/pages/more/console/console.dart +++ b/lib/ui/pages/more/console/console.dart @@ -11,7 +11,7 @@ class Console extends StatefulWidget { const Console({Key? key}) : super(key: key); @override - _ConsoleState createState() => _ConsoleState(); + State createState() => _ConsoleState(); } class _ConsoleState extends State { diff --git a/lib/ui/pages/more/more.dart b/lib/ui/pages/more/more.dart index 790170c5..55b6239a 100644 --- a/lib/ui/pages/more/more.dart +++ b/lib/ui/pages/more/more.dart @@ -10,7 +10,7 @@ import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/pages/setup/initializing.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; -import 'package:selfprivacy/ui/pages/rootRoute.dart'; +import 'package:selfprivacy/ui/pages/root_route.dart'; import 'package:selfprivacy/ui/pages/ssh_keys/ssh_keys.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; @@ -43,7 +43,7 @@ class MorePage extends StatelessWidget { _NavItem( title: 'more.configuration_wizard'.tr(), iconData: BrandIcons.triangle, - goTo: InitializingPage(), + goTo: const InitializingPage(), ), _NavItem( title: 'more.settings.title'.tr(), diff --git a/lib/ui/pages/onboarding/onboarding.dart b/lib/ui/pages/onboarding/onboarding.dart index eecd55c8..4530c746 100644 --- a/lib/ui/pages/onboarding/onboarding.dart +++ b/lib/ui/pages/onboarding/onboarding.dart @@ -10,7 +10,7 @@ class OnboardingPage extends StatefulWidget { final Widget nextPage; @override - _OnboardingPageState createState() => _OnboardingPageState(); + State createState() => _OnboardingPageState(); } class _OnboardingPageState extends State { diff --git a/lib/ui/pages/providers/providers.dart b/lib/ui/pages/providers/providers.dart index 754e7866..b3566f2f 100644 --- a/lib/ui/pages/providers/providers.dart +++ b/lib/ui/pages/providers/providers.dart @@ -24,7 +24,7 @@ class ProvidersPage extends StatefulWidget { const ProvidersPage({Key? key}) : super(key: key); @override - _ProvidersPageState createState() => _ProvidersPageState(); + State createState() => _ProvidersPageState(); } class _ProvidersPageState extends State { @@ -124,7 +124,7 @@ class _Card extends StatelessWidget { stableText = 'providers.domain.status'.tr(); onTap = () => Navigator.of(context).push(materialRoute( - DnsDetailsPage(), + const DnsDetailsPage(), )); break; case ProviderType.backup: diff --git a/lib/ui/pages/root_route.dart b/lib/ui/pages/root_route.dart index d66d73c3..e3ad4ce4 100644 --- a/lib/ui/pages/root_route.dart +++ b/lib/ui/pages/root_route.dart @@ -13,7 +13,7 @@ class RootPage extends StatefulWidget { const RootPage({Key? key}) : super(key: key); @override - _RootPageState createState() => _RootPageState(); + State createState() => _RootPageState(); } class _RootPageState extends State diff --git a/lib/ui/pages/server_details/chart.dart b/lib/ui/pages/server_details/chart.dart index 7829234b..bc94bac4 100644 --- a/lib/ui/pages/server_details/chart.dart +++ b/lib/ui/pages/server_details/chart.dart @@ -90,7 +90,11 @@ class _Chart extends StatelessWidget { return SizedBox( height: 200, - child: CpuChart(data, state.period, state.start), + child: CpuChart( + data: data, + period: state.period, + start: state.start, + ), ); } @@ -101,9 +105,9 @@ class _Chart extends StatelessWidget { return SizedBox( height: 200, child: NetworkChart( - [ppsIn, ppsOut], - state.period, - state.start, + listData: [ppsIn, ppsOut], + period: state.period, + start: state.start, ), ); } @@ -115,9 +119,9 @@ class _Chart extends StatelessWidget { return SizedBox( height: 200, child: NetworkChart( - [ppsIn, ppsOut], - state.period, - state.start, + listData: [ppsIn, ppsOut], + period: state.period, + start: state.start, ), ); } diff --git a/lib/ui/pages/server_details/cpu_chart.dart b/lib/ui/pages/server_details/cpu_chart.dart index 113c797b..07bd8539 100644 --- a/lib/ui/pages/server_details/cpu_chart.dart +++ b/lib/ui/pages/server_details/cpu_chart.dart @@ -7,7 +7,12 @@ import 'package:selfprivacy/logic/models/hetzner_metrics.dart'; import 'package:intl/intl.dart'; class CpuChart extends StatelessWidget { - const CpuChart(this.data, this.period, this.start); + const CpuChart({ + Key? key, + required this.data, + required this.period, + required this.start, + }) : super(key: key); final List data; final Period period; @@ -103,8 +108,8 @@ class CpuChart extends StatelessWidget { } else if (value == 0) { return true; } - var _value = value - minValue; - var v = _value / 20; + var localValue = value - minValue; + var v = localValue / 20; return v - v.floor() == 0; } diff --git a/lib/ui/pages/server_details/network_charts.dart b/lib/ui/pages/server_details/network_charts.dart index 4e0b385e..31b3dd21 100644 --- a/lib/ui/pages/server_details/network_charts.dart +++ b/lib/ui/pages/server_details/network_charts.dart @@ -9,11 +9,12 @@ import 'package:selfprivacy/logic/models/hetzner_metrics.dart'; import 'package:intl/intl.dart'; class NetworkChart extends StatelessWidget { - const NetworkChart( - this.listData, - this.period, - this.start, - ); + const NetworkChart({ + Key? key, + required this.listData, + required this.period, + required this.start, + }) : super(key: key); final List> listData; final Period period; @@ -132,9 +133,9 @@ class NetworkChart extends StatelessWidget { } else if (value == 0) { return true; } - var _value = value - minValue; - var v = _value / 20; - return v - v.floor() == 0; + var diff = value - minValue; + var finalValue = diff / 20; + return finalValue - finalValue.floor() == 0; } String bottomTitle(int value) { diff --git a/lib/ui/pages/server_details/server_details_screen.dart b/lib/ui/pages/server_details/server_details_screen.dart index 8fe4b04e..5eb3be3e 100644 --- a/lib/ui/pages/server_details/server_details_screen.dart +++ b/lib/ui/pages/server_details/server_details_screen.dart @@ -37,7 +37,7 @@ class ServerDetailsScreen extends StatefulWidget { const ServerDetailsScreen({Key? key}) : super(key: key); @override - _ServerDetailsScreenState createState() => _ServerDetailsScreenState(); + State createState() => _ServerDetailsScreenState(); } class _ServerDetailsScreenState extends State diff --git a/lib/ui/pages/server_details/server_settings.dart b/lib/ui/pages/server_details/server_settings.dart index f5047d6c..93393632 100644 --- a/lib/ui/pages/server_details/server_settings.dart +++ b/lib/ui/pages/server_details/server_settings.dart @@ -42,6 +42,7 @@ class _ServerSettings extends StatelessWidget { child: const _TextColumn( title: 'Allow Auto-upgrade', value: 'Wether to allow automatic packages upgrades', + hasWarning: false, ), ), SwitcherBlock( @@ -50,15 +51,17 @@ class _ServerSettings extends StatelessWidget { child: const _TextColumn( title: 'Reboot after upgrade', value: 'Reboot without prompt after applying updates', + hasWarning: false, ), ), _Button( onTap: () { - Navigator.of(context).push(materialRoute(SelectTimezone())); + Navigator.of(context).push(materialRoute(const SelectTimezone())); }, child: _TextColumn( title: 'Server Timezone', value: serverDetailsState.serverTimezone.timezone.name, + hasWarning: false, ), ), ], diff --git a/lib/ui/pages/server_details/time_zone/time_zone.dart b/lib/ui/pages/server_details/time_zone/time_zone.dart index 0ae610cf..402aeb26 100644 --- a/lib/ui/pages/server_details/time_zone/time_zone.dart +++ b/lib/ui/pages/server_details/time_zone/time_zone.dart @@ -8,7 +8,7 @@ class SelectTimezone extends StatefulWidget { const SelectTimezone({Key? key}) : super(key: key); @override - _SelectTimezoneState createState() => _SelectTimezoneState(); + State createState() => _SelectTimezoneState(); } class _SelectTimezoneState extends State { diff --git a/lib/ui/pages/services/services.dart b/lib/ui/pages/services/services.dart index 77134124..e2f3f4ed 100644 --- a/lib/ui/pages/services/services.dart +++ b/lib/ui/pages/services/services.dart @@ -35,13 +35,13 @@ class ServicesPage extends StatefulWidget { const ServicesPage({Key? key}) : super(key: key); @override - _ServicesPageState createState() => _ServicesPageState(); + State createState() => _ServicesPageState(); } void _launchURL(url) async { - var _possible = await canLaunchUrlString(url); + var canLaunch = await canLaunchUrlString(url); - if (_possible) { + if (canLaunch) { try { await launchUrlString( url, diff --git a/lib/ui/pages/setup/initializing.dart b/lib/ui/pages/setup/initializing.dart index 5121ac36..98853c8f 100644 --- a/lib/ui/pages/setup/initializing.dart +++ b/lib/ui/pages/setup/initializing.dart @@ -21,6 +21,8 @@ import 'package:selfprivacy/ui/pages/setup/recovering/recovery_routing.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; class InitializingPage extends StatelessWidget { + const InitializingPage({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { var cubit = context.watch(); diff --git a/lib/ui/pages/setup/recovering/recover_by_old_token.dart b/lib/ui/pages/setup/recovering/recover_by_old_token.dart index ea267a39..b16ff964 100644 --- a/lib/ui/pages/setup/recovering/recover_by_old_token.dart +++ b/lib/ui/pages/setup/recovering/recover_by_old_token.dart @@ -10,7 +10,9 @@ import 'package:selfprivacy/logic/cubit/forms/factories/field_cubit_factory.dart class RecoverByOldTokenInstruction extends StatelessWidget { @override - const RecoverByOldTokenInstruction({required this.instructionFilename}); + const RecoverByOldTokenInstruction( + {Key? key, required this.instructionFilename}) + : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/ui/pages/setup/recovering/recovery_confirm_server.dart b/lib/ui/pages/setup/recovering/recovery_confirm_server.dart index 0f03090e..96bcb51d 100644 --- a/lib/ui/pages/setup/recovering/recovery_confirm_server.dart +++ b/lib/ui/pages/setup/recovering/recovery_confirm_server.dart @@ -11,7 +11,7 @@ class RecoveryConfirmServer extends StatefulWidget { const RecoveryConfirmServer({Key? key}) : super(key: key); @override - _RecoveryConfirmServerState createState() => _RecoveryConfirmServerState(); + State createState() => _RecoveryConfirmServerState(); } class _RecoveryConfirmServerState extends State { @@ -57,11 +57,11 @@ class _RecoveryConfirmServerState extends State { children: [ if (servers.length == 1 || (!_isExtended && _isServerFound(servers))) - _ConfirmServer(context, _firstValidServer(servers), + confirmServer(context, _firstValidServer(servers), servers.length > 1), if (servers.length > 1 && (_isExtended || !_isServerFound(servers))) - _ChooseServer(context, servers), + chooseServer(context, servers), ], ), if (servers?.isEmpty ?? true) @@ -84,14 +84,14 @@ class _RecoveryConfirmServerState extends State { ); } - Widget _ConfirmServer( + Widget confirmServer( BuildContext context, ServerBasicInfoWithValidators server, bool showMoreServersButton, ) { return Column( children: [ - _ServerCard( + serverCard( context: context, server: server, ), @@ -110,14 +110,14 @@ class _RecoveryConfirmServerState extends State { ); } - Widget _ChooseServer( + Widget chooseServer( BuildContext context, List servers) { return Column( children: [ for (final server in servers) Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), - child: _ServerCard( + child: serverCard( context: context, server: server, onTap: () => _showConfirmationDialog(context, server), @@ -127,7 +127,7 @@ class _RecoveryConfirmServerState extends State { ); } - Widget _ServerCard( + Widget serverCard( {required BuildContext context, required ServerBasicInfoWithValidators server, VoidCallback? onTap}) { diff --git a/lib/ui/pages/setup/recovering/recovery_method_select.dart b/lib/ui/pages/setup/recovering/recovery_method_select.dart index ed768c5a..554f40eb 100644 --- a/lib/ui/pages/setup/recovering/recovery_method_select.dart +++ b/lib/ui/pages/setup/recovering/recovery_method_select.dart @@ -47,7 +47,7 @@ class RecoveryMethodSelect extends StatelessWidget { BrandButton.text( title: 'recovering.method_select_nothing'.tr(), onPressed: () => Navigator.of(context) - .push(materialRoute(RecoveryFallbackMethodSelect())), + .push(materialRoute(const RecoveryFallbackMethodSelect())), ) ], ); diff --git a/lib/ui/pages/setup/recovering/recovery_routing.dart b/lib/ui/pages/setup/recovering/recovery_routing.dart index 7ce718fd..65ff5688 100644 --- a/lib/ui/pages/setup/recovering/recovery_routing.dart +++ b/lib/ui/pages/setup/recovering/recovery_routing.dart @@ -36,10 +36,10 @@ class RecoveryRouting extends StatelessWidget { currentPage = const RecoverByRecoveryKey(); break; case RecoveryStep.newDeviceKey: - currentPage = RecoverByNewDeviceKeyInstruction(); + currentPage = const RecoverByNewDeviceKeyInstruction(); break; case RecoveryStep.oldToken: - currentPage = RecoverByOldToken(); + currentPage = const RecoverByOldToken(); break; case RecoveryStep.hetznerToken: currentPage = const RecoveryHetznerConnected(); diff --git a/lib/ui/pages/ssh_keys/ssh_keys.dart b/lib/ui/pages/ssh_keys/ssh_keys.dart index c527a972..6fc5087b 100644 --- a/lib/ui/pages/ssh_keys/ssh_keys.dart +++ b/lib/ui/pages/ssh_keys/ssh_keys.dart @@ -24,7 +24,7 @@ class SshKeysPage extends StatefulWidget { const SshKeysPage({Key? key, required this.user}) : super(key: key); @override - _SshKeysPageState createState() => _SshKeysPageState(); + State createState() => _SshKeysPageState(); } class _SshKeysPageState extends State {