From 97f20bafe5149e11a9aa8e61766c49118204a01f Mon Sep 17 00:00:00 2001
From: poka <poka@p2p.legal>
Date: Sun, 14 Nov 2021 19:21:20 +0100
Subject: [PATCH] Apply linter

---
 analysis_options.yaml                         |  29 +
 lib/globals.dart                              |  12 +-
 lib/main.dart                                 |  42 +-
 .../{cesiumPlus.dart => cesium_plus.dart}     |   4 -
 .../{changePin.dart => change_pin.dart}       |   4 +-
 .../{chestData.dart => chest_data.dart}       |   4 +-
 .../{chestData.g.dart => chest_data.g.dart}   |   2 +-
 ...rateWallets.dart => generate_wallets.dart} |  16 +-
 lib/models/history.dart                       |  24 +-
 lib/models/home.dart                          |   8 +-
 .../{myWallets.dart => my_wallets.dart}       |  18 +-
 .../{walletData.dart => wallet_data.dart}     |   8 +-
 .../{walletData.g.dart => wallet_data.g.dart} |   2 +-
 ...walletOptions.dart => wallet_options.dart} |  36 +-
 ...mmonElements.dart => common_elements.dart} |  24 +-
 lib/screens/history.dart                      |  92 +--
 lib/screens/home.dart                         |  95 +--
 ...ptions.dart => cesium_wallet_options.dart} |  78 +--
 .../{changePin.dart => change_pin.dart}       |  61 +-
 .../{chooseChest.dart => choose_chest.dart}   |  26 +-
 ...orage.dart => confirm_wallet_storage.dart} |  52 +-
 ...rateWallets.dart => generate_wallets.dart} |  96 +--
 .../{importWallet.dart => import_wallet.dart} |  92 ++-
 ...ckingWallet.dart => unlocking_wallet.dart} |  35 +-
 ...walletOptions.dart => wallet_options.dart} |  78 +--
 .../{walletsHome.dart => wallets_home.dart}   | 104 ++--
 ...ainFound.dart => 0_no_keychain_found.dart} |  40 +-
 lib/screens/onBoarding/1.dart                 |  16 +-
 lib/screens/onBoarding/10.dart                |  14 +-
 lib/screens/onBoarding/11.dart                |  84 +--
 lib/screens/onBoarding/12.dart                |  28 +-
 .../onBoarding/13_congratulations.dart        |  14 +-
 lib/screens/onBoarding/2.dart                 |  17 +-
 lib/screens/onBoarding/3.dart                 |  14 +-
 lib/screens/onBoarding/4.dart                 |  14 +-
 lib/screens/onBoarding/5.dart                 |  20 +-
 lib/screens/onBoarding/6.dart                 |  34 +-
 lib/screens/onBoarding/7.dart                 |  50 +-
 lib/screens/onBoarding/8.dart                 |  26 +-
 lib/screens/onBoarding/9.dart                 |  21 +-
 lib/screens/settings.dart                     |  30 +-
 ...mplateScreen.dart => template_screen.dart} |  27 +-
 macos/.gitignore                              |   7 +
 macos/Flutter/Flutter-Debug.xcconfig          |   1 +
 macos/Flutter/Flutter-Release.xcconfig        |   1 +
 macos/Flutter/GeneratedPluginRegistrant.swift |  24 +
 macos/Runner.xcodeproj/project.pbxproj        | 572 ++++++++++++++++++
 .../xcshareddata/IDEWorkspaceChecks.plist     |   8 +
 .../xcshareddata/xcschemes/Runner.xcscheme    |  89 +++
 .../contents.xcworkspacedata                  |   7 +
 .../xcshareddata/IDEWorkspaceChecks.plist     |   8 +
 macos/Runner/AppDelegate.swift                |   9 +
 .../AppIcon.appiconset/Contents.json          |  68 +++
 .../AppIcon.appiconset/app_icon_1024.png      | Bin 0 -> 46993 bytes
 .../AppIcon.appiconset/app_icon_128.png       | Bin 0 -> 3276 bytes
 .../AppIcon.appiconset/app_icon_16.png        | Bin 0 -> 1429 bytes
 .../AppIcon.appiconset/app_icon_256.png       | Bin 0 -> 5933 bytes
 .../AppIcon.appiconset/app_icon_32.png        | Bin 0 -> 1243 bytes
 .../AppIcon.appiconset/app_icon_512.png       | Bin 0 -> 14800 bytes
 .../AppIcon.appiconset/app_icon_64.png        | Bin 0 -> 1874 bytes
 macos/Runner/Base.lproj/MainMenu.xib          | 339 +++++++++++
 macos/Runner/Configs/AppInfo.xcconfig         |  14 +
 macos/Runner/Configs/Debug.xcconfig           |   2 +
 macos/Runner/Configs/Release.xcconfig         |   2 +
 macos/Runner/Configs/Warnings.xcconfig        |  13 +
 macos/Runner/DebugProfile.entitlements        |  12 +
 macos/Runner/Info.plist                       |  32 +
 macos/Runner/MainFlutterWindow.swift          |  15 +
 macos/Runner/Release.entitlements             |   8 +
 pubspec.lock                                  |  14 +
 pubspec.yaml                                  |   1 +
 test_driver/app_test.dart                     |  32 +-
 windows/.gitignore                            |  17 +
 windows/CMakeLists.txt                        |  95 +++
 windows/flutter/CMakeLists.txt                | 103 ++++
 .../flutter/generated_plugin_registrant.cc    |  20 +
 windows/flutter/generated_plugin_registrant.h |  15 +
 windows/flutter/generated_plugins.cmake       |  18 +
 windows/runner/CMakeLists.txt                 |  17 +
 windows/runner/Runner.rc                      | 121 ++++
 windows/runner/flutter_window.cpp             |  61 ++
 windows/runner/flutter_window.h               |  33 +
 windows/runner/main.cpp                       |  43 ++
 windows/runner/resource.h                     |  16 +
 windows/runner/resources/app_icon.ico         | Bin 0 -> 33772 bytes
 windows/runner/runner.exe.manifest            |  20 +
 windows/runner/utils.cpp                      |  64 ++
 windows/runner/utils.h                        |  19 +
 windows/runner/win32_window.cpp               | 245 ++++++++
 windows/runner/win32_window.h                 |  98 +++
 90 files changed, 3056 insertions(+), 718 deletions(-)
 create mode 100644 analysis_options.yaml
 rename lib/models/{cesiumPlus.dart => cesium_plus.dart} (96%)
 rename lib/models/{changePin.dart => change_pin.dart} (90%)
 rename lib/models/{chestData.dart => chest_data.dart} (90%)
 rename lib/models/{chestData.g.dart => chest_data.g.dart} (98%)
 rename lib/models/{generateWallets.dart => generate_wallets.dart} (95%)
 rename lib/models/{myWallets.dart => my_wallets.dart} (88%)
 rename lib/models/{walletData.dart => wallet_data.dart} (77%)
 rename lib/models/{walletData.g.dart => wallet_data.g.dart} (97%)
 rename lib/models/{walletOptions.dart => wallet_options.dart} (90%)
 rename lib/screens/{commonElements.dart => common_elements.dart} (91%)
 rename lib/screens/myWallets/{cesiumWalletOptions.dart => cesium_wallet_options.dart} (88%)
 rename lib/screens/myWallets/{changePin.dart => change_pin.dart} (66%)
 rename lib/screens/myWallets/{chooseChest.dart => choose_chest.dart} (86%)
 rename lib/screens/myWallets/{confirmWalletStorage.dart => confirm_wallet_storage.dart} (82%)
 rename lib/screens/myWallets/{generateWallets.dart => generate_wallets.dart} (70%)
 rename lib/screens/myWallets/{importWallet.dart => import_wallet.dart} (76%)
 rename lib/screens/myWallets/{unlockingWallet.dart => unlocking_wallet.dart} (87%)
 rename lib/screens/myWallets/{walletOptions.dart => wallet_options.dart} (88%)
 rename lib/screens/myWallets/{walletsHome.dart => wallets_home.dart} (83%)
 rename lib/screens/onBoarding/{0_noKeychainFound.dart => 0_no_keychain_found.dart} (79%)
 rename lib/screens/{templateScreen.dart => template_screen.dart} (79%)
 create mode 100644 macos/.gitignore
 create mode 100644 macos/Flutter/Flutter-Debug.xcconfig
 create mode 100644 macos/Flutter/Flutter-Release.xcconfig
 create mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift
 create mode 100644 macos/Runner.xcodeproj/project.pbxproj
 create mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
 create mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
 create mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata
 create mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
 create mode 100644 macos/Runner/AppDelegate.swift
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
 create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
 create mode 100644 macos/Runner/Base.lproj/MainMenu.xib
 create mode 100644 macos/Runner/Configs/AppInfo.xcconfig
 create mode 100644 macos/Runner/Configs/Debug.xcconfig
 create mode 100644 macos/Runner/Configs/Release.xcconfig
 create mode 100644 macos/Runner/Configs/Warnings.xcconfig
 create mode 100644 macos/Runner/DebugProfile.entitlements
 create mode 100644 macos/Runner/Info.plist
 create mode 100644 macos/Runner/MainFlutterWindow.swift
 create mode 100644 macos/Runner/Release.entitlements
 create mode 100644 windows/.gitignore
 create mode 100644 windows/CMakeLists.txt
 create mode 100644 windows/flutter/CMakeLists.txt
 create mode 100644 windows/flutter/generated_plugin_registrant.cc
 create mode 100644 windows/flutter/generated_plugin_registrant.h
 create mode 100644 windows/flutter/generated_plugins.cmake
 create mode 100644 windows/runner/CMakeLists.txt
 create mode 100644 windows/runner/Runner.rc
 create mode 100644 windows/runner/flutter_window.cpp
 create mode 100644 windows/runner/flutter_window.h
 create mode 100644 windows/runner/main.cpp
 create mode 100644 windows/runner/resource.h
 create mode 100644 windows/runner/resources/app_icon.ico
 create mode 100644 windows/runner/runner.exe.manifest
 create mode 100644 windows/runner/utils.cpp
 create mode 100644 windows/runner/utils.h
 create mode 100644 windows/runner/win32_window.cpp
 create mode 100644 windows/runner/win32_window.h

diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 00000000..61b6c4de
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+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`
+  # included above or to enable additional rules. A list of all available lints
+  # and their documentation is published at
+  # https://dart-lang.github.io/linter/lints/index.html.
+  #
+  # Instead of disabling a lint rule for the entire project in the
+  # section below, it can also be suppressed for a single line of code
+  # or a specific dart file by using the `// ignore: name_of_lint` and
+  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+  # producing the lint.
+  rules:
+    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
+    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/lib/globals.dart b/lib/globals.dart
index e573a7ac..115be3dc 100644
--- a/lib/globals.dart
+++ b/lib/globals.dart
@@ -1,7 +1,7 @@
 import 'dart:io';
 import 'package:flutter/material.dart';
-import 'package:gecko/models/chestData.dart';
-import 'package:gecko/models/walletData.dart';
+import 'package:gecko/models/chest_data.dart';
+import 'package:gecko/models/wallet_data.dart';
 import 'package:hive/hive.dart';
 import 'package:logger/logger.dart';
 import 'package:shared_preferences/shared_preferences.dart';
@@ -28,7 +28,7 @@ double ratio;
 var log = Logger();
 
 // Colors
-Color orangeC = Color(0xffd07316);
-Color yellowC = Color(0xffFFD68E);
-Color floattingYellow = Color(0xffEFEFBF);
-Color backgroundColor = Color(0xFFF5F5F5);
+Color orangeC = const Color(0xffd07316);
+Color yellowC = const Color(0xffFFD68E);
+Color floattingYellow = const Color(0xffEFEFBF);
+Color backgroundColor = const Color(0xFFF5F5F5);
diff --git a/lib/main.dart b/lib/main.dart
index 36cfc48f..e1c3f5b0 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -13,22 +13,24 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
+// ignore_for_file: avoid_print
+
 import 'dart:async';
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/cesiumPlus.dart';
-import 'package:gecko/models/changePin.dart';
-import 'package:gecko/models/chestData.dart';
-import 'package:gecko/models/generateWallets.dart';
+import 'package:gecko/models/cesium_plus.dart';
+import 'package:gecko/models/change_pin.dart';
+import 'package:gecko/models/chest_data.dart';
+import 'package:gecko/models/generate_wallets.dart';
 import 'package:gecko/models/history.dart';
 import 'package:gecko/models/home.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:gecko/screens/home.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:gecko/screens/myWallets/walletsHome.dart';
+import 'package:gecko/screens/myWallets/wallets_home.dart';
 import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:hive_flutter/hive_flutter.dart';
 import 'package:path_provider/path_provider.dart';
@@ -38,7 +40,7 @@ import 'package:responsive_framework/responsive_framework.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 import 'package:sentry_flutter/sentry_flutter.dart';
 
-final bool enableSentry = true;
+const bool enableSentry = true;
 
 Future<void> main() async {
   WidgetsFlutterBinding.ensureInitialized();
@@ -106,7 +108,7 @@ Future<void> main() async {
 }
 
 class Gecko extends StatelessWidget {
-  Gecko(this.randomEndpoint);
+  const Gecko(this.randomEndpoint, {Key key}) : super(key: key);
   final String randomEndpoint;
 
   @override
@@ -145,28 +147,28 @@ class Gecko extends StatelessWidget {
                 minWidth: 480,
                 defaultScale: true,
                 breakpoints: [
-                  ResponsiveBreakpoint.resize(480, name: MOBILE),
-                  ResponsiveBreakpoint.autoScale(800, name: TABLET),
-                  ResponsiveBreakpoint.resize(1000, name: DESKTOP),
+                  const ResponsiveBreakpoint.resize(480, name: MOBILE),
+                  const ResponsiveBreakpoint.autoScale(800, name: TABLET),
+                  const ResponsiveBreakpoint.resize(1000, name: DESKTOP),
                 ],
                 background: Container(color: backgroundColor)),
             title: 'Ğecko',
             theme: ThemeData(
-              appBarTheme: AppBarTheme(
-                color: const Color(0xffFFD58D),
-                foregroundColor: const Color(0xFF000000),
+              appBarTheme: const AppBarTheme(
+                color: Color(0xffFFD58D),
+                foregroundColor: Color(0xFF000000),
               ),
-              primaryColor: Color(0xffFFD58D),
-              textTheme: TextTheme(
+              primaryColor: const Color(0xffFFD58D),
+              textTheme: const TextTheme(
                 bodyText1: TextStyle(),
                 bodyText2: TextStyle(),
               ).apply(
-                bodyColor: Color(0xFF000000),
+                bodyColor: const Color(0xFF000000),
               ),
               colorScheme: ColorScheme.fromSwatch()
                   .copyWith(secondary: Colors.grey[850]),
             ),
-            home: HomeScreen(),
+            home: const HomeScreen(),
             initialRoute: "/",
             routes: {
               '/mywallets': (context) => WalletsHome(),
diff --git a/lib/models/cesiumPlus.dart b/lib/models/cesium_plus.dart
similarity index 96%
rename from lib/models/cesiumPlus.dart
rename to lib/models/cesium_plus.dart
index 47ebef1b..8d73d005 100644
--- a/lib/models/cesiumPlus.dart
+++ b/lib/models/cesium_plus.dart
@@ -7,10 +7,6 @@ import 'package:http/http.dart' as http;
 import 'package:path_provider/path_provider.dart';
 
 class CesiumPlusProvider with ChangeNotifier {
-  // String pubkey = '';
-  // CesiumPlusProvider(this.pubkey);
-  var decodedBytes;
-  var avatar64;
   TextEditingController cesiumName = TextEditingController();
   int iAvatar = 0;
   bool isComplete = false;
diff --git a/lib/models/changePin.dart b/lib/models/change_pin.dart
similarity index 90%
rename from lib/models/changePin.dart
rename to lib/models/change_pin.dart
index 3c85b2ec..b65e74c4 100644
--- a/lib/models/changePin.dart
+++ b/lib/models/change_pin.dart
@@ -3,11 +3,11 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'dart:async';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/chestData.dart';
+import 'package:gecko/models/chest_data.dart';
 
 class ChangePinProvider with ChangeNotifier {
   bool ischangedPin = false;
-  TextEditingController newPin = new TextEditingController();
+  TextEditingController newPin = TextEditingController();
 
   Future<NewWallet> get badWallet => null;
 
diff --git a/lib/models/chestData.dart b/lib/models/chest_data.dart
similarity index 90%
rename from lib/models/chestData.dart
rename to lib/models/chest_data.dart
index a0532892..923a3855 100644
--- a/lib/models/chestData.dart
+++ b/lib/models/chest_data.dart
@@ -1,6 +1,6 @@
 import 'package:hive_flutter/hive_flutter.dart';
 
-part 'chestData.g.dart';
+part 'chest_data.g.dart';
 
 @HiveType(typeId: 1)
 class ChestData extends HiveObject {
@@ -29,6 +29,6 @@ class ChestData extends HiveObject {
 
   @override
   String toString() {
-    return this.name;
+    return name;
   }
 }
diff --git a/lib/models/chestData.g.dart b/lib/models/chest_data.g.dart
similarity index 98%
rename from lib/models/chestData.g.dart
rename to lib/models/chest_data.g.dart
index 9beaa421..ca25dffe 100644
--- a/lib/models/chestData.g.dart
+++ b/lib/models/chest_data.g.dart
@@ -1,6 +1,6 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
-part of 'chestData.dart';
+part of 'chest_data.dart';
 
 // **************************************************************************
 // TypeAdapterGenerator
diff --git a/lib/models/generateWallets.dart b/lib/models/generate_wallets.dart
similarity index 95%
rename from lib/models/generateWallets.dart
rename to lib/models/generate_wallets.dart
index d74666f1..3b8cec8a 100644
--- a/lib/models/generateWallets.dart
+++ b/lib/models/generate_wallets.dart
@@ -5,8 +5,8 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/chestData.dart';
-import 'package:gecko/models/walletData.dart';
+import 'package:gecko/models/chest_data.dart';
+import 'package:gecko/models/wallet_data.dart';
 import 'package:pdf/pdf.dart';
 import 'package:pdf/widgets.dart' as pw;
 import 'package:printing/printing.dart';
@@ -100,7 +100,7 @@ class GenerateWalletsProvider with ChangeNotifier {
   }
 
   int getRandomInt() {
-    var rng = new Random();
+    var rng = Random();
     return rng.nextInt(12);
   }
 
@@ -131,7 +131,7 @@ class GenerateWalletsProvider with ChangeNotifier {
   Future<String> generateMnemonic() async {
     try {
       generatedMnemonic = await DubpRust.genMnemonic(language: Language.french);
-      this.actualWallet = await generateWallet(this.generatedMnemonic);
+      actualWallet = await generateWallet(generatedMnemonic);
       walletIsGenerated = true;
     } catch (e) {
       log.e(e);
@@ -141,7 +141,7 @@ class GenerateWalletsProvider with ChangeNotifier {
 
   Future<NewWallet> generateWallet(generatedMnemonic) async {
     try {
-      this.actualWallet = await DubpRust.genWalletFromMnemonic(
+      actualWallet = await DubpRust.genWalletFromMnemonic(
         language: Language.french,
         mnemonic: generatedMnemonic,
         secretCodeType: SecretCodeType.letters,
@@ -151,10 +151,10 @@ class GenerateWalletsProvider with ChangeNotifier {
     }
 
     mnemonicController.text = generatedMnemonic;
-    pin.text = this.actualWallet.pin;
+    pin.text = actualWallet.pin;
     // notifyListeners();
 
-    return this.actualWallet;
+    return actualWallet;
   }
 
   Future<NewWallet> changePinCode({bool reload}) async {
@@ -177,7 +177,7 @@ class GenerateWalletsProvider with ChangeNotifier {
     final pw.Font ttf = pw.Font.ttf(fontData.buffer.asByteData());
     final pdf = pw.Document();
 
-    const imageProvider = const AssetImage('assets/icon/gecko_final.png');
+    const imageProvider = AssetImage('assets/icon/gecko_final.png');
     final geckoLogo = await flutterImageProvider(imageProvider);
 
     pdf.addPage(
diff --git a/lib/models/history.dart b/lib/models/history.dart
index ff762f07..19a15fa4 100644
--- a/lib/models/history.dart
+++ b/lib/models/history.dart
@@ -3,8 +3,8 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
 import 'package:gecko/models/home.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletData.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_data.dart';
 import 'package:gecko/screens/history.dart';
 import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:jdenticon_dart/jdenticon_dart.dart';
@@ -42,7 +42,7 @@ class HistoryProvider with ChangeNotifier {
       return 'false';
     }
     if (barcode != null) {
-      this.outputPubkey.text = barcode;
+      outputPubkey.text = barcode;
       isPubkey(context, barcode);
     } else {
       return 'false';
@@ -77,7 +77,7 @@ class HistoryProvider with ChangeNotifier {
   String isPubkey(context, pubkey, {bool goHistory}) {
     HomeProvider _homeProvider =
         Provider.of<HomeProvider>(context, listen: false);
-    final RegExp regExp = new RegExp(
+    final RegExp regExp = RegExp(
       r'^[a-zA-Z0-9]+$',
       caseSensitive: false,
       multiLine: false,
@@ -91,9 +91,9 @@ class HistoryProvider with ChangeNotifier {
       this.pubkey = pubkey;
       getShortPubkey(pubkey);
 
-      this.outputPubkey.text = pubkey;
+      outputPubkey.text = pubkey;
 
-      if (goHistory == null) goHistory = false;
+      goHistory ??= false;
 
       if (goHistory) {
         isHistoryScreen = true;
@@ -144,13 +144,13 @@ class HistoryProvider with ChangeNotifier {
     var transBC = [];
     int i = 0;
 
-    final currentBase = 0;
+    const currentBase = 0;
     double currentUD = 10.54;
 
     for (final trans in txs) {
       var direction = trans['direction'];
       final transaction = trans['node'];
-      var output;
+      String output;
       if (direction == "RECEIVED") {
         for (String line in transaction['outputs']) {
           if (line.contains(_pubkey)) {
@@ -241,15 +241,15 @@ class HistoryProvider with ChangeNotifier {
       } else {
         _message = "Vous êtes connecté au noeud\n${endPointGVA.split('/')[2]}";
       }
-      final snackBar =
-          SnackBar(content: Text(_message), duration: Duration(seconds: 2));
+      final snackBar = SnackBar(
+          content: Text(_message), duration: const Duration(seconds: 2));
       isFirstBuild = false;
       ScaffoldMessenger.of(context).showSnackBar(snackBar);
     }
   }
 
   void resetdHistory() {
-    this.outputPubkey.text = '';
+    outputPubkey.text = '';
     notifyListeners();
   }
 
@@ -259,7 +259,7 @@ class HistoryProvider with ChangeNotifier {
   }
 
   snackCopyKey(context) {
-    final snackBar = SnackBar(
+    const snackBar = SnackBar(
         content:
             Text("Cette clé publique a été copié dans votre presse-papier."),
         duration: Duration(seconds: 2));
diff --git a/lib/models/home.dart b/lib/models/home.dart
index 1b67d41a..69fe956f 100644
--- a/lib/models/home.dart
+++ b/lib/models/home.dart
@@ -9,14 +9,14 @@ import 'package:flutter/services.dart';
 import 'dart:async';
 import 'package:gecko/globals.dart';
 import 'package:gecko/screens/history.dart';
-import 'package:gecko/screens/myWallets/walletsHome.dart';
+import 'package:gecko/screens/myWallets/wallets_home.dart';
 import 'package:package_info/package_info.dart';
 
 class HomeProvider with ChangeNotifier {
   int _currentIndex = 0;
   bool isSearching;
-  Icon searchIcon = Icon(Icons.search);
-  final TextEditingController searchQuery = new TextEditingController();
+  Icon searchIcon = const Icon(Icons.search);
+  final TextEditingController searchQuery = TextEditingController();
   Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
   Widget appBarExplorer =
       Text('Explorateur', style: TextStyle(color: Colors.grey[850]));
@@ -57,7 +57,7 @@ class HomeProvider with ChangeNotifier {
     String _endpoint;
     int _statusCode = 0;
 
-    final _client = new HttpClient();
+    final _client = HttpClient();
     _client.connectionTimeout = const Duration(milliseconds: 1000);
 
     do {
diff --git a/lib/models/myWallets.dart b/lib/models/my_wallets.dart
similarity index 88%
rename from lib/models/myWallets.dart
rename to lib/models/my_wallets.dart
index 53d0da09..886202ab 100644
--- a/lib/models/myWallets.dart
+++ b/lib/models/my_wallets.dart
@@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'dart:async';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/walletData.dart';
+import 'package:gecko/models/wallet_data.dart';
 
 class MyWalletsProvider with ChangeNotifier {
   List<WalletData> listWallets = [];
@@ -41,12 +41,12 @@ class MyWalletsProvider with ChangeNotifier {
     if (_id.isEmpty) return WalletData();
     int _chest = _id[0];
     int _nbr = _id[1];
-    var _targetedWallet;
+    WalletData _targetedWallet;
 
     walletBox.toMap().forEach((key, value) {
       if (value.chest == _chest && value.number == _nbr) {
         _targetedWallet = value;
-        return false;
+        return;
       }
     });
 
@@ -86,19 +86,19 @@ class MyWalletsProvider with ChangeNotifier {
       barrierDismissible: true, // user must tap button!
       builder: (BuildContext context) {
         return AlertDialog(
-          title:
-              Text('Êtes-vous sûr de vouloir supprimer tous vos trousseaux ?'),
-          content: SingleChildScrollView(child: Text('')),
+          title: const Text(
+              'Êtes-vous sûr de vouloir supprimer tous vos trousseaux ?'),
+          content: const SingleChildScrollView(child: Text('')),
           actions: <Widget>[
             TextButton(
-              child: Text("Non"),
+              child: const Text("Non"),
               onPressed: () {
                 Navigator.pop(context, false);
               },
             ),
             TextButton(
-              key: Key('confirmDeletingAllWallets'),
-              child: Text("Oui"),
+              key: const Key('confirmDeletingAllWallets'),
+              child: const Text("Oui"),
               onPressed: () {
                 Navigator.pop(context, true);
               },
diff --git a/lib/models/walletData.dart b/lib/models/wallet_data.dart
similarity index 77%
rename from lib/models/walletData.dart
rename to lib/models/wallet_data.dart
index 2c4a82de..f4ce723e 100644
--- a/lib/models/walletData.dart
+++ b/lib/models/wallet_data.dart
@@ -1,6 +1,6 @@
 import 'package:hive_flutter/hive_flutter.dart';
 
-part 'walletData.g.dart';
+part 'wallet_data.g.dart';
 
 @HiveType(typeId: 0)
 class WalletData extends HiveObject {
@@ -25,16 +25,16 @@ class WalletData extends HiveObject {
   // representation of WalletData when debugging
   @override
   String toString() {
-    return this.name;
+    return name;
   }
 
   // creates the ':'-separated string from the WalletData
   String inLine() {
-    return "${this.chest}:${this.number}:${this.name}:${this.derivation}:${this.imageName}";
+    return "$chest:$number:$name:$derivation:$imageName";
   }
 
   // returns only the id part of the ':'-separated string
   List id() {
-    return [this.chest, this.number];
+    return [chest, number];
   }
 }
diff --git a/lib/models/walletData.g.dart b/lib/models/wallet_data.g.dart
similarity index 97%
rename from lib/models/walletData.g.dart
rename to lib/models/wallet_data.g.dart
index 36d6a0ba..4ef937a3 100644
--- a/lib/models/walletData.g.dart
+++ b/lib/models/wallet_data.g.dart
@@ -1,6 +1,6 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
-part of 'walletData.dart';
+part of 'wallet_data.dart';
 
 // **************************************************************************
 // TypeAdapterGenerator
diff --git a/lib/models/walletOptions.dart b/lib/models/wallet_options.dart
similarity index 90%
rename from lib/models/walletOptions.dart
rename to lib/models/wallet_options.dart
index 5b0f8329..19c80995 100644
--- a/lib/models/walletOptions.dart
+++ b/lib/models/wallet_options.dart
@@ -8,18 +8,18 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'dart:async';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletData.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_data.dart';
 import 'package:image_picker/image_picker.dart';
 import 'package:truncate/truncate.dart';
 import 'package:qrscan/qrscan.dart' as scanner;
 
 class WalletOptionsProvider with ChangeNotifier {
   TextEditingController pubkey = TextEditingController();
-  TextEditingController _newWalletName = TextEditingController();
+  final TextEditingController _newWalletName = TextEditingController();
   bool isWalletUnlock = false;
   bool ischangedPin = false;
-  TextEditingController newPin = new TextEditingController();
+  TextEditingController newPin = TextEditingController();
   bool isEditing = false;
   bool isBalanceBlur = true;
   FocusNode walletNameFocus = FocusNode();
@@ -32,7 +32,7 @@ class WalletOptionsProvider with ChangeNotifier {
   Future _getPubkeyFromDewif(
       String _dewif, _pin, int _pinLenght, int derivation) async {
     String _pubkey;
-    RegExp regExp = new RegExp(
+    RegExp regExp = RegExp(
       r'^[A-Z0-9]+$',
       caseSensitive: false,
       multiLine: false,
@@ -47,7 +47,7 @@ class WalletOptionsProvider with ChangeNotifier {
         List _pubkeysTmp = await DubpRust.getBip32DewifAccountsPublicKeys(
             dewif: _dewif, secretCode: _pin, accountsIndex: [derivation]);
         _pubkey = _pubkeysTmp[0];
-        this.pubkey.text = _pubkey;
+        pubkey.text = _pubkey;
         notifyListeners();
 
         return _pubkey;
@@ -60,7 +60,7 @@ class WalletOptionsProvider with ChangeNotifier {
     } else {
       try {
         _pubkey = await DubpRust.getDewifPublicKey(dewif: _dewif, pin: _pin);
-        this.pubkey.text = _pubkey;
+        pubkey.text = _pubkey;
         notifyListeners();
         return _pubkey;
       } catch (e) {
@@ -82,7 +82,7 @@ class WalletOptionsProvider with ChangeNotifier {
       if ((_localPubkey = await _getPubkeyFromDewif(
               _localDewif, _pin, _pinLenght, _wallet.derivation)) !=
           'false') {
-        this.pubkey.text = _localPubkey;
+        pubkey.text = _localPubkey;
         isWalletUnlock = true;
         return _localDewif;
       } else {
@@ -91,7 +91,7 @@ class WalletOptionsProvider with ChangeNotifier {
     } catch (e) {
       // _homeProvider.playSound('non', 0.6);
       log.e('ERROR READING FILE: $e');
-      this.pubkey.clear();
+      pubkey.clear();
       return 'bad';
     }
   }
@@ -142,16 +142,16 @@ class WalletOptionsProvider with ChangeNotifier {
       barrierDismissible: true,
       builder: (BuildContext context) {
         return AlertDialog(
-          title: Text('Choisissez un nouveau nom pour ce portefeuille'),
+          title: const Text('Choisissez un nouveau nom pour ce portefeuille'),
           content: SingleChildScrollView(
             child: ListBody(
               children: <Widget>[
                 TextField(
-                    controller: this._newWalletName,
+                    controller: _newWalletName,
                     maxLines: 1,
                     textAlign: TextAlign.center,
-                    decoration: InputDecoration(),
-                    style: TextStyle(
+                    decoration: const InputDecoration(),
+                    style: const TextStyle(
                         fontSize: 14.0,
                         color: Colors.black,
                         fontWeight: FontWeight.bold)),
@@ -160,7 +160,7 @@ class WalletOptionsProvider with ChangeNotifier {
           ),
           actions: <Widget>[
             TextButton(
-              child: Text("Valider"),
+              child: const Text("Valider"),
               onPressed: () {
                 WidgetsBinding.instance.addPostFrameCallback((_) async {
                   // await _renameWallet(_walletName, this._newWalletName.text,
@@ -219,20 +219,20 @@ class WalletOptionsProvider with ChangeNotifier {
               'Êtes-vous sûr de vouloir supprimer le portefeuille "$_walletName" ?'),
           content: SingleChildScrollView(
             child: ListBody(
-              children: <Widget>[
+              children: const <Widget>[
                 Text('Vous pourrez restaurer ce portefeuille plus tard.'),
               ],
             ),
           ),
           actions: <Widget>[
             TextButton(
-              child: Text("Non", key: Key('cancelDeleting')),
+              child: const Text("Non", key: Key('cancelDeleting')),
               onPressed: () {
                 Navigator.pop(context, false);
               },
             ),
             TextButton(
-              child: Text("Oui", key: Key('confirmDeleting')),
+              child: const Text("Oui", key: Key('confirmDeleting')),
               onPressed: () {
                 Navigator.pop(context, true);
               },
@@ -244,7 +244,7 @@ class WalletOptionsProvider with ChangeNotifier {
   }
 
   snackCopyKey(context) {
-    final snackBar = SnackBar(
+    const snackBar = SnackBar(
         content:
             Text("Cette clé publique a été copié dans votre presse-papier."),
         duration: Duration(seconds: 2));
diff --git a/lib/screens/commonElements.dart b/lib/screens/common_elements.dart
similarity index 91%
rename from lib/screens/commonElements.dart
rename to lib/screens/common_elements.dart
index 78c66216..4056d564 100644
--- a/lib/screens/commonElements.dart
+++ b/lib/screens/common_elements.dart
@@ -5,22 +5,22 @@ import 'package:gecko/globals.dart';
 class CommonElements {
   // Exemple de Widget
   Widget exemple(String data) {
-    return Text('Coucou');
+    return const Text('Coucou');
   }
 
   Widget bubbleSpeak(String text, {double long, Key textKey}) {
     return Bubble(
       padding: long == null
-          ? BubbleEdges.all(18)
+          ? const BubbleEdges.all(18)
           : BubbleEdges.symmetric(horizontal: long, vertical: 30),
       elevation: 5,
       color: Colors.white,
-      margin: BubbleEdges.fromLTRB(10, 0, 20, 10),
+      margin: const BubbleEdges.fromLTRB(10, 0, 20, 10),
       // nip: BubbleNip.leftTop,
       child: Text(
         text,
         key: textKey,
-        style: TextStyle(
+        style: const TextStyle(
             color: Colors.black, fontSize: 18, fontWeight: FontWeight.w400),
       ),
     );
@@ -28,15 +28,15 @@ class CommonElements {
 
   Widget bubbleSpeakRich(List<TextSpan> text, {Key textKey}) {
     return Bubble(
-      padding: BubbleEdges.all(18),
+      padding: const BubbleEdges.all(18),
       elevation: 5,
       color: Colors.white,
-      margin: BubbleEdges.fromLTRB(10, 0, 20, 10),
+      margin: const BubbleEdges.fromLTRB(10, 0, 20, 10),
       // nip: BubbleNip.leftTop,
       child: RichText(
           key: textKey,
           text: TextSpan(
-            style: TextStyle(
+            style: const TextStyle(
               fontSize: 18.0,
               color: Colors.black,
             ),
@@ -87,7 +87,7 @@ class CommonElements {
           top: 70,
           right: 90,
           child: Text(progress == 12 ? '11/11' : '$progress/11',
-              style: TextStyle(fontSize: 12, color: Colors.black)),
+              style: const TextStyle(fontSize: 12, color: Colors.black)),
         ),
     ]);
   }
@@ -102,7 +102,7 @@ class CommonElements {
     return Container(
       child: ClipOval(
         child: Material(
-          color: Color(0xffFFD58D), // button color
+          color: const Color(0xffFFD58D), // button color
           child: InkWell(
               splashColor: orangeC, // inkwell color
               child: Padding(
@@ -113,7 +113,7 @@ class CommonElements {
               }),
         ),
       ),
-      decoration: BoxDecoration(
+      decoration: const BoxDecoration(
         shape: BoxShape.circle,
         color: Colors.white,
         boxShadow: [
@@ -207,14 +207,14 @@ class GeckoSpeechAppBar extends StatelessWidget with PreferredSizeWidget {
   GeckoSpeechAppBar(
     this.title, {
     Key key,
-  })  : preferredSize = Size.fromHeight(105.4),
+  })  : preferredSize = const Size.fromHeight(105.4),
         super(key: key);
 
   @override
   Widget build(BuildContext context) {
     return AppBar(
         leading: IconButton(
-          icon: Container(
+          icon: SizedBox(
               height: 30,
               child: Image.asset('assets/onBoarding/gecko_bar.png')),
           onPressed: () => Navigator.popUntil(
diff --git a/lib/screens/history.dart b/lib/screens/history.dart
index b92ada56..b5dd1b69 100644
--- a/lib/screens/history.dart
+++ b/lib/screens/history.dart
@@ -1,15 +1,15 @@
 import 'dart:io';
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/cesiumPlus.dart';
+import 'package:gecko/models/cesium_plus.dart';
 import 'package:gecko/models/home.dart';
-import 'package:gecko/models/myWallets.dart';
+import 'package:gecko/models/my_wallets.dart';
 import 'package:gecko/models/queries.dart';
 import 'package:gecko/models/history.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/foundation.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/screens/myWallets/unlockingWallet.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
 import 'dart:ui';
 import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:provider/provider.dart';
@@ -22,7 +22,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
   final nRepositories = 20;
   // HistoryProvider _historyProvider;
   final _formKey = GlobalKey<FormState>();
-  FocusNode _pubkeyFocus = FocusNode();
+  final FocusNode _pubkeyFocus = FocusNode();
   List cesiumData;
   final double avatarsSize = 80;
 
@@ -30,12 +30,14 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
   FetchMoreOptions opts;
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 
+  HistoryScreen({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
     HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context);
     HomeProvider _homeProvider = Provider.of<HomeProvider>(context);
-    this._outputPubkey.text = _historyProvider.pubkey;
+    _outputPubkey.text = _historyProvider.pubkey;
     log.i('Build pubkey : ' + _historyProvider.pubkey);
     WidgetsBinding.instance.addPostFrameCallback((_) {});
 
@@ -45,7 +47,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
           title: _homeProvider.appBarExplorer,
           actions: [
             Padding(
-                padding: EdgeInsets.symmetric(horizontal: 16),
+                padding: const EdgeInsets.symmetric(horizontal: 16),
                 child: IconButton(
                     icon: _homeProvider.searchIcon,
                     color: Colors.grey[850],
@@ -81,9 +83,9 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                       }
                     }))
           ],
-          backgroundColor: Color(0xffFFD58D),
+          backgroundColor: const Color(0xffFFD58D),
         ),
-        floatingActionButton: Container(
+        floatingActionButton: SizedBox(
           height: 80.0,
           width: 80.0,
           child: FittedBox(
@@ -92,11 +94,11 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
               onPressed: () async {
                 await _historyProvider.scan(context);
               },
-              child: Container(
+              child: SizedBox(
                   height: 40.0,
                   width: 40.0,
                   child: Padding(
-                      padding: EdgeInsets.symmetric(horizontal: 3),
+                      padding: const EdgeInsets.symmetric(horizontal: 3),
                       child: Image.asset('assets/qrcode-scan.png'))),
               backgroundColor:
                   floattingYellow, //smoothYellow, //Color.fromARGB(500, 204, 255, 255),
@@ -104,7 +106,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
           ),
         ),
         body: Column(children: <Widget>[
-          SizedBox(height: 0),
+          const SizedBox(height: 0),
           if (_historyProvider.pubkey != '')
             historyQuery(context, _historyProvider),
         ]));
@@ -139,7 +141,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
 
             if (result.hasException) {
               log.e('Error GVA: ' + result.exception.toString());
-              return Column(children: <Widget>[
+              return Column(children: const <Widget>[
                 SizedBox(height: 50),
                 Text(
                   "Aucun noeud GVA valide n'a pu être trouvé.\nVeuillez réessayer ultérieurement.",
@@ -171,10 +173,10 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                 child: Builder(
                     builder: (context) => Expanded(
                             child: ListView(
-                          key: Key('listTransactions'),
+                          key: const Key('listTransactions'),
                           controller: scrollController,
                           children: <Widget>[
-                            SizedBox(height: 20),
+                            const SizedBox(height: 20),
                             if (_historyProvider.pubkey != '')
                               Row(
                                   mainAxisAlignment:
@@ -214,7 +216,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                                                 if (_avatar.hasData) {
                                                   return SingleChildScrollView(
                                                       padding:
-                                                          EdgeInsets.all(0.0),
+                                                          const EdgeInsets.all(
+                                                              0.0),
                                                       child: Image.file(
                                                           _avatar.data[0],
                                                           height: avatarsSize));
@@ -225,7 +228,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                                                     height: avatarsSize);
                                               })),
                                     GestureDetector(
-                                      key: Key('copyPubkey'),
+                                      key: const Key('copyPubkey'),
                                       onTap: () {
                                         Clipboard.setData(ClipboardData(
                                             text: _historyProvider.pubkey));
@@ -234,7 +237,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                                       child: Text(
                                           _historyProvider.getShortPubkey(
                                               _historyProvider.pubkey),
-                                          style: TextStyle(
+                                          style: const TextStyle(
                                               fontSize: 22,
                                               fontWeight: FontWeight.w800,
                                               fontFamily: 'Monospace')),
@@ -257,7 +260,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                                             ],
                                           ),
                                         )),
-                                    SizedBox(width: 0)
+                                    const SizedBox(width: 0)
                                   ]),
                             if (_isFirstExec)
                               Row(
@@ -274,25 +277,22 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                                                 _historyProvider.pubkey),
                                             initialData: '...',
                                             builder: (context, snapshot) {
-                                              return Text(
-                                                  snapshot.data != null
-                                                      ? snapshot.data
-                                                      : '-',
-                                                  style:
-                                                      TextStyle(fontSize: 20));
+                                              return Text(snapshot.data ?? '-',
+                                                  style: const TextStyle(
+                                                      fontSize: 20));
                                             }))
                                   ]),
-                            SizedBox(height: 18),
+                            const SizedBox(height: 18),
                             if (_isFirstExec)
                               Container(
                                   padding:
                                       const EdgeInsets.fromLTRB(0, 0, 0, 0),
                                   child: Text(balance.toString() + ' Ğ1',
                                       textAlign: TextAlign.center,
-                                      style: TextStyle(fontSize: 18.0))),
-                            SizedBox(height: 20),
+                                      style: const TextStyle(fontSize: 18.0))),
+                            const SizedBox(height: 20),
                             ElevatedButton(
-                                key: Key('switchPayHistory'),
+                                key: const Key('switchPayHistory'),
                                 style: ElevatedButton.styleFrom(
                                   elevation: 1,
                                   primary: Colors.grey[50], // background
@@ -344,32 +344,32 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
           child: Column(
             mainAxisSize: MainAxisSize.min,
             children: <Widget>[
-              SizedBox(height: 20),
-              Text('Commentaire:', style: TextStyle(fontSize: 20.0)),
+              const SizedBox(height: 20),
+              const Text('Commentaire:', style: TextStyle(fontSize: 20.0)),
               Padding(
-                  padding: EdgeInsets.all(8.0),
+                  padding: const EdgeInsets.all(8.0),
                   child: TextField(
                       controller: _historyProvider.payComment,
                       maxLines: 2,
                       textAlign: TextAlign.center,
-                      decoration: InputDecoration(),
-                      style: TextStyle(
+                      decoration: const InputDecoration(),
+                      style: const TextStyle(
                           fontSize: 22,
                           color: Colors.black,
                           fontWeight: FontWeight.bold))),
-              SizedBox(height: 20),
-              Text('Montant (DU/Ğ1):', style: TextStyle(fontSize: 20.0)),
+              const SizedBox(height: 20),
+              const Text('Montant (DU/Ğ1):', style: TextStyle(fontSize: 20.0)),
               Padding(
-                padding: EdgeInsets.all(8.0),
+                padding: const EdgeInsets.all(8.0),
                 child: TextFormField(
-                  style: TextStyle(fontSize: 22),
+                  style: const TextStyle(fontSize: 22),
                   controller: _historyProvider.payAmount,
                   textAlign: TextAlign.center,
                   maxLines: 1,
                   keyboardType: TextInputType.number,
                   decoration: InputDecoration(
-                    contentPadding:
-                        EdgeInsets.symmetric(vertical: 25.0, horizontal: 10.0),
+                    contentPadding: const EdgeInsets.symmetric(
+                        vertical: 25.0, horizontal: 10.0),
                     border: OutlineInputBorder(
                         borderRadius: BorderRadius.circular(10.0)),
                   ),
@@ -412,7 +412,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
     int keyID = 0;
 
     return _historyProvider.transBC == null
-        ? Text('Aucune transaction à afficher.')
+        ? const Text('Aucune transaction à afficher.')
         : Column(children: <Widget>[
             for (var repository in _historyProvider.transBC)
               Padding(
@@ -427,14 +427,14 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                               fontWeight: FontWeight.w700),
                           textAlign: TextAlign.center),
                       title: Text(repository[3],
-                          style: TextStyle(
+                          style: const TextStyle(
                               fontSize: 15.0, fontFamily: 'Monospace'),
                           textAlign: TextAlign.center),
                       subtitle: Text(repository[6] != '' ? repository[6] : '-',
-                          style: TextStyle(fontSize: 12.0),
+                          style: const TextStyle(fontSize: 12.0),
                           textAlign: TextAlign.center),
                       trailing: Text("${repository[4]} Ğ1",
-                          style: TextStyle(fontSize: 14.0),
+                          style: const TextStyle(fontSize: 14.0),
                           textAlign: TextAlign.justify),
                       dense: true,
                       isThreeLine: false,
@@ -445,14 +445,14 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
             if (result.isLoading)
               Row(
                 mainAxisAlignment: MainAxisAlignment.center,
-                children: <Widget>[
+                children: const <Widget>[
                   CircularProgressIndicator(),
                 ],
               ),
             // if (_historyProvider.isTheEnd) // What I did before ...
             if (!_historyProvider.pageInfo['hasPreviousPage'])
               Column(
-                children: <Widget>[
+                children: const <Widget>[
                   SizedBox(height: 15),
                   Text("Début de l'historique.",
                       textAlign: TextAlign.center,
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 22b74d7c..fcc22a8c 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -3,16 +3,18 @@ import 'package:gecko/globals.dart';
 import 'package:gecko/models/history.dart';
 import 'package:gecko/models/home.dart';
 import 'package:flutter/material.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/screens/myWallets/unlockingWallet.dart';
-import 'package:gecko/screens/onBoarding/0_noKeychainFound.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
+import 'package:gecko/screens/onBoarding/0_no_keychain_found.dart';
 import 'dart:ui';
 import 'package:gecko/screens/settings.dart';
 import 'package:flutter/services.dart';
 import 'package:provider/provider.dart';
 
 class HomeScreen extends StatelessWidget {
+  const HomeScreen({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -46,7 +48,7 @@ class HomeScreen extends StatelessWidget {
               Expanded(
                   child: ListView(padding: EdgeInsets.zero, children: <Widget>[
                 DrawerHeader(
-                  child: Column(children: <Widget>[
+                  child: Column(children: const <Widget>[
                     SizedBox(height: 0),
                     Image(
                         image: AssetImage('assets/icon/gecko_final.png'),
@@ -57,8 +59,8 @@ class HomeScreen extends StatelessWidget {
                   ),
                 ),
                 ListTile(
-                  key: Key('parameters'),
-                  title: Text('Paramètres'),
+                  key: const Key('parameters'),
+                  title: const Text('Paramètres'),
                   onTap: () {
                     Navigator.pop(context);
                     Navigator.push(
@@ -70,34 +72,33 @@ class HomeScreen extends StatelessWidget {
                   },
                 ),
                 ListTile(
-                  title: Text('A propos'),
+                  title: const Text('A propos'),
                   onTap: () {
                     // Update the state of the app.
                     // ...
                   },
                 ),
               ])),
-              Container(
-                  child: Align(
-                      alignment: FractionalOffset.bottomCenter,
-                      child: Text('Ğecko v$appVersion'))),
-              SizedBox(height: 20)
+              Align(
+                  alignment: FractionalOffset.bottomCenter,
+                  child: Text('Ğecko v$appVersion')),
+              const SizedBox(height: 20)
             ],
           ),
         ),
         appBar: AppBar(
           leading: Builder(
               builder: (context) => IconButton(
-                    key: Key('drawerMenu'),
-                    icon: new Icon(Icons.menu, color: Colors.grey[850]),
+                    key: const Key('drawerMenu'),
+                    icon: Icon(Icons.menu, color: Colors.grey[850]),
                     onPressed: () => Scaffold.of(context).openDrawer(),
                   )),
           title: _homeProvider.appBarTitle,
           actions: [
             Padding(
-                padding: EdgeInsets.symmetric(horizontal: 16),
+                padding: const EdgeInsets.symmetric(horizontal: 16),
                 child: IconButton(
-                    key: Key('searchIcon'),
+                    key: const Key('searchIcon'),
                     icon: _homeProvider.searchIcon,
                     color: Colors.grey[850],
                     onPressed: () {
@@ -107,7 +108,7 @@ class HomeScreen extends StatelessWidget {
                           color: Colors.grey[850],
                         );
                         _homeProvider.appBarTitle = TextField(
-                          key: Key('searchInput'),
+                          key: const Key('searchInput'),
                           autofocus: true,
                           controller: _homeProvider.searchQuery,
                           onChanged: (text) {
@@ -133,9 +134,9 @@ class HomeScreen extends StatelessWidget {
                       }
                     }))
           ],
-          backgroundColor: Color(0xffFFD58D),
+          backgroundColor: const Color(0xffFFD58D),
         ),
-        backgroundColor: Color(0xffF9F9F1),
+        backgroundColor: const Color(0xffF9F9F1),
         body: Builder(
             builder: (ctx) => StatefulWrapper(
                   onInit: () {
@@ -146,10 +147,10 @@ class HomeScreen extends StatelessWidget {
                   },
                   child: Column(children: <Widget>[
                     Padding(
-                        padding: EdgeInsets.only(top: 20),
+                        padding: const EdgeInsets.only(top: 20),
                         child: Row(
                             mainAxisAlignment: MainAxisAlignment.center,
-                            children: <Widget>[
+                            children: const <Widget>[
                               SizedBox(width: 7),
                               Image(
                                   image:
@@ -157,10 +158,10 @@ class HomeScreen extends StatelessWidget {
                                   height: 180),
                             ])),
                     Padding(
-                        padding: EdgeInsets.only(top: 15),
+                        padding: const EdgeInsets.only(top: 15),
                         child: Row(
                             mainAxisAlignment: MainAxisAlignment.center,
-                            children: <Widget>[
+                            children: const <Widget>[
                               Text(
                                 "y'a pas de lézard !",
                                 textAlign: TextAlign.center,
@@ -171,7 +172,7 @@ class HomeScreen extends StatelessWidget {
                               )
                             ])),
                     Padding(
-                        padding: EdgeInsets.only(top: 60),
+                        padding: const EdgeInsets.only(top: 60),
                         child: Row(
                             mainAxisAlignment: MainAxisAlignment.center,
                             children: <Widget>[
@@ -179,10 +180,11 @@ class HomeScreen extends StatelessWidget {
                                 Container(
                                   child: ClipOval(
                                     child: Material(
-                                      color: Color(0xffFFD58D), // button color
+                                      color: const Color(
+                                          0xffFFD58D), // button color
                                       child: InkWell(
                                           splashColor: orangeC, // inkwell color
-                                          child: Padding(
+                                          child: const Padding(
                                               padding: EdgeInsets.all(22),
                                               child: Image(
                                                   image: AssetImage(
@@ -194,7 +196,7 @@ class HomeScreen extends StatelessWidget {
                                           }),
                                     ),
                                   ),
-                                  decoration: BoxDecoration(
+                                  decoration: const BoxDecoration(
                                     shape: BoxShape.circle,
                                     color: Colors.white,
                                     boxShadow: [
@@ -206,8 +208,8 @@ class HomeScreen extends StatelessWidget {
                                     ],
                                   ),
                                 ),
-                                SizedBox(height: 12),
-                                Text(
+                                const SizedBox(height: 12),
+                                const Text(
                                   "Payer par QR-Code",
                                   textAlign: TextAlign.center,
                                   style: TextStyle(
@@ -216,7 +218,7 @@ class HomeScreen extends StatelessWidget {
                               ])
                             ])),
                     Padding(
-                        padding: EdgeInsets.only(top: 50),
+                        padding: const EdgeInsets.only(top: 50),
                         child: Row(
                             mainAxisAlignment: MainAxisAlignment.center,
                             children: <Widget>[
@@ -224,10 +226,11 @@ class HomeScreen extends StatelessWidget {
                                 Container(
                                   child: ClipOval(
                                     child: Material(
-                                      color: Color(0xffFFD58D), // button color
+                                      color: const Color(
+                                          0xffFFD58D), // button color
                                       child: InkWell(
                                           splashColor: orangeC, // inkwell color
-                                          child: Padding(
+                                          child: const Padding(
                                               padding: EdgeInsets.symmetric(
                                                   horizontal: 20, vertical: 16),
                                               child: Image(
@@ -245,7 +248,7 @@ class HomeScreen extends StatelessWidget {
                                           }),
                                     ),
                                   ),
-                                  decoration: BoxDecoration(
+                                  decoration: const BoxDecoration(
                                     shape: BoxShape.circle,
                                     color: Colors.white,
                                     boxShadow: [
@@ -257,24 +260,25 @@ class HomeScreen extends StatelessWidget {
                                     ],
                                   ),
                                 ),
-                                SizedBox(height: 12),
-                                Text(
+                                const SizedBox(height: 12),
+                                const Text(
                                   "Explorer\n",
                                   textAlign: TextAlign.center,
                                   style: TextStyle(
                                       color: Colors.black, fontSize: 16),
                                 )
                               ]),
-                              SizedBox(width: 140),
+                              const SizedBox(width: 140),
                               Column(children: <Widget>[
                                 Container(
                                   child: ClipOval(
-                                    key: Key('manageWallets'),
+                                    key: const Key('manageWallets'),
                                     child: Material(
-                                      color: Color(0xffFFD58D), // button color
+                                      color: const Color(
+                                          0xffFFD58D), // button color
                                       child: InkWell(
                                           splashColor: orangeC, // inkwell color
-                                          child: Padding(
+                                          child: const Padding(
                                               padding: EdgeInsets.all(23),
                                               child: Image(
                                                   image: AssetImage(
@@ -296,12 +300,12 @@ class HomeScreen extends StatelessWidget {
                                                 : Navigator.push(context,
                                                     MaterialPageRoute(
                                                         builder: (context) {
-                                                    return NoKeyChainScreen();
+                                                    return const NoKeyChainScreen();
                                                   }));
                                           }),
                                     ),
                                   ),
-                                  decoration: BoxDecoration(
+                                  decoration: const BoxDecoration(
                                     shape: BoxShape.circle,
                                     color: Colors.white,
                                     boxShadow: [
@@ -313,8 +317,8 @@ class HomeScreen extends StatelessWidget {
                                     ],
                                   ),
                                 ),
-                                SizedBox(height: 12),
-                                Text(
+                                const SizedBox(height: 12),
+                                const Text(
                                   "Gérer mes\nportefeuilles",
                                   textAlign: TextAlign.center,
                                   style: TextStyle(
@@ -351,7 +355,8 @@ class HomeScreen extends StatelessWidget {
 class StatefulWrapper extends StatefulWidget {
   final Function onInit;
   final Widget child;
-  const StatefulWrapper({@required this.onInit, @required this.child});
+  const StatefulWrapper({Key key, @required this.onInit, @required this.child})
+      : super(key: key);
   @override
   _StatefulWrapperState createState() => _StatefulWrapperState();
 }
diff --git a/lib/screens/myWallets/cesiumWalletOptions.dart b/lib/screens/myWallets/cesium_wallet_options.dart
similarity index 88%
rename from lib/screens/myWallets/cesiumWalletOptions.dart
rename to lib/screens/myWallets/cesium_wallet_options.dart
index da1b0438..319bbbe4 100644
--- a/lib/screens/myWallets/cesiumWalletOptions.dart
+++ b/lib/screens/myWallets/cesium_wallet_options.dart
@@ -3,10 +3,10 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
 import 'package:gecko/models/history.dart';
-import 'package:gecko/models/myWallets.dart';
+import 'package:gecko/models/my_wallets.dart';
 import 'package:gecko/models/queries.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:provider/provider.dart';
 import 'package:flutter/services.dart';
@@ -42,8 +42,9 @@ class CesiumWalletOptions extends StatelessWidget {
     _walletOptions.nameController.text.length >= 15
         ? _nbrLinesName = 2
         : _nbrLinesName = 1;
-    if (_walletOptions.nameController.text.length >= 26 && isTall)
+    if (_walletOptions.nameController.text.length >= 26 && isTall) {
       _nbrLinesName = 3;
+    }
 
     _walletOptions.walletID = [0, cesiumWallet.number];
 
@@ -71,7 +72,7 @@ class CesiumWalletOptions extends StatelessWidget {
           resizeToAvoidBottomInset: false,
           appBar: AppBar(
               leading: IconButton(
-                  icon: Icon(Icons.arrow_back, color: Colors.black),
+                  icon: const Icon(Icons.arrow_back, color: Colors.black),
                   onPressed: () {
                     _walletOptions.isEditing = false;
                     _walletOptions.isBalanceBlur = true;
@@ -98,11 +99,11 @@ class CesiumWalletOptions extends StatelessWidget {
                       end: Alignment.bottomCenter,
                       colors: [
                         yellowC,
-                        Color(0xfffafafa),
+                        const Color(0xfffafafa),
                       ],
                     )),
                     child: Row(children: <Widget>[
-                      SizedBox(width: 25),
+                      const SizedBox(width: 25),
                       InkWell(
                           onTap: () async {
                             await _walletOptions.changeAvatar();
@@ -119,7 +120,7 @@ class CesiumWalletOptions extends StatelessWidget {
                             Image.asset(
                               'assets/walletOptions/camera.png',
                             ),
-                            SizedBox(height: 100)
+                            const SizedBox(height: 100)
                           ])),
                       Column(children: <Widget>[
                         Row(children: <Widget>[
@@ -127,14 +128,14 @@ class CesiumWalletOptions extends StatelessWidget {
                             SizedBox(
                               width: 260,
                               child: TextField(
-                                  key: Key('walletName'),
+                                  key: const Key('walletName'),
                                   autofocus: false,
                                   focusNode: _walletOptions.walletNameFocus,
                                   enabled: _walletOptions.isEditing,
                                   controller: _walletOptions.nameController,
                                   maxLines: _nbrLinesName,
                                   textAlign: TextAlign.center,
-                                  decoration: InputDecoration(
+                                  decoration: const InputDecoration(
                                     border: InputBorder.none,
                                     focusedBorder: InputBorder.none,
                                     enabledBorder: InputBorder.none,
@@ -163,7 +164,7 @@ class CesiumWalletOptions extends StatelessWidget {
                                 }
 
                                 if (result.isLoading) {
-                                  return Text('Loading');
+                                  return const Text('Loading');
                                 }
 
                                 // List repositories = result.data['viewer']['repositories']['nodes'];
@@ -190,7 +191,7 @@ class CesiumWalletOptions extends StatelessWidget {
                                         sigmaY: _walletOptions.isBalanceBlur
                                             ? 5
                                             : 0),
-                                    child: Text('$wBalanceUD',
+                                    child: Text(wBalanceUD,
                                         style: TextStyle(
                                             fontSize: isTall ? 20 : 18,
                                             color: Colors.black)),
@@ -208,9 +209,9 @@ class CesiumWalletOptions extends StatelessWidget {
                                 // );
                               },
                             ),
-                            SizedBox(height: 5),
+                            const SizedBox(height: 5),
                             InkWell(
-                                key: Key('displayBalance'),
+                                key: const Key('displayBalance'),
                                 onTap: () {
                                   _walletOptions.bluringBalance();
                                 },
@@ -220,15 +221,15 @@ class CesiumWalletOptions extends StatelessWidget {
                                       : 'assets/walletOptions/icon_oeuil_close.png',
                                 )),
                           ]),
-                          SizedBox(width: 0),
+                          const SizedBox(width: 0),
                           Column(children: <Widget>[
                             InkWell(
-                                key: Key('renameWallet'),
+                                key: const Key('renameWallet'),
                                 onTap: () async {
                                   _isNewNameValid = _walletOptions
                                       .editWalletName(_walletOptions.walletID);
                                   await Future.delayed(
-                                      Duration(milliseconds: 30));
+                                      const Duration(milliseconds: 30));
                                   _walletOptions.walletNameFocus.requestFocus();
                                 },
                                 child: ClipRRect(
@@ -239,7 +240,7 @@ class CesiumWalletOptions extends StatelessWidget {
                                       width: 20,
                                       height: 20),
                                 )),
-                            SizedBox(
+                            const SizedBox(
                               height: 60,
                             )
                           ])
@@ -254,11 +255,11 @@ class CesiumWalletOptions extends StatelessWidget {
                       return snapshot.data != null
                           ? Image.memory(snapshot.data,
                               height: isTall ? 300 : 270)
-                          : Text('-', style: TextStyle(fontSize: 20));
+                          : const Text('-', style: TextStyle(fontSize: 20));
                     }),
                 SizedBox(height: 15 * ratio),
                 GestureDetector(
-                    key: Key('copyPubkey'),
+                    key: const Key('copyPubkey'),
                     onTap: () {
                       Clipboard.setData(
                           ClipboardData(text: _walletOptions.pubkey.text));
@@ -267,30 +268,29 @@ class CesiumWalletOptions extends StatelessWidget {
                     child: SizedBox(
                         height: 50,
                         child: Row(children: <Widget>[
-                          SizedBox(width: 30),
+                          const SizedBox(width: 30),
                           Image.asset(
                             'assets/walletOptions/key.png',
                           ),
-                          SizedBox(width: 10),
+                          const SizedBox(width: 10),
                           Text("${shortPubkey.split(':')[0]}:",
-                              style: TextStyle(
+                              style: const TextStyle(
                                   fontSize: 22,
                                   fontWeight: FontWeight.w800,
                                   fontFamily: 'Monospace',
                                   color: Colors.black)),
                           Text(shortPubkey.split(':')[1],
-                              style: TextStyle(
+                              style: const TextStyle(
                                   fontSize: 22,
                                   fontWeight: FontWeight.w800,
                                   fontFamily: 'Monospace')),
-                          SizedBox(width: 15),
+                          const SizedBox(width: 15),
                           SizedBox(
                               height: 40,
                               child: ElevatedButton(
                                   style: ElevatedButton.styleFrom(
                                     shape: RoundedRectangleBorder(
-                                      borderRadius:
-                                          new BorderRadius.circular(8),
+                                      borderRadius: BorderRadius.circular(8),
                                     ),
                                     elevation: 1,
                                     primary: orangeC, // background
@@ -305,7 +305,7 @@ class CesiumWalletOptions extends StatelessWidget {
                                     Image.asset(
                                       'assets/walletOptions/copy-white.png',
                                     ),
-                                    SizedBox(width: 7),
+                                    const SizedBox(width: 7),
                                     Text('Copier',
                                         style: TextStyle(
                                             fontSize: 15,
@@ -314,7 +314,7 @@ class CesiumWalletOptions extends StatelessWidget {
                         ]))),
                 SizedBox(height: 10 * ratio),
                 InkWell(
-                    key: Key('displayHistory'),
+                    key: const Key('displayHistory'),
                     onTap: () {
                       _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text,
                           goHistory: true);
@@ -322,18 +322,18 @@ class CesiumWalletOptions extends StatelessWidget {
                     child: SizedBox(
                         height: 50,
                         child: Row(children: <Widget>[
-                          SizedBox(width: 30),
+                          const SizedBox(width: 30),
                           Image.asset(
                             'assets/walletOptions/clock.png',
                           ),
-                          SizedBox(width: 12),
-                          Text('Historique des transactions',
+                          const SizedBox(width: 12),
+                          const Text('Historique des transactions',
                               style:
                                   TextStyle(fontSize: 20, color: Colors.black)),
                         ]))),
                 SizedBox(height: 12 * ratio),
                 InkWell(
-                    key: Key('setDefaultWallet'),
+                    key: const Key('setDefaultWallet'),
                     onTap: !_walletOptions.isDefaultWallet
                         ? () {
                             defaultWallet = cesiumWallet;
@@ -346,14 +346,14 @@ class CesiumWalletOptions extends StatelessWidget {
                     child: SizedBox(
                         height: 50,
                         child: Row(children: <Widget>[
-                          SizedBox(width: 31),
+                          const SizedBox(width: 31),
                           CircleAvatar(
                               backgroundColor: Colors.grey[
                                   _walletOptions.isDefaultWallet ? 300 : 500],
                               child: Image.asset(
                                 'assets/walletOptions/android-checkmark.png',
                               )),
-                          SizedBox(width: 12),
+                          const SizedBox(width: 12),
                           Text(
                               _walletOptions.isDefaultWallet
                                   ? 'Ce portefeuille est celui par defaut'
@@ -367,7 +367,7 @@ class CesiumWalletOptions extends StatelessWidget {
                 SizedBox(height: 17 * ratio),
                 if (!_walletOptions.isDefaultWallet)
                   InkWell(
-                      key: Key('deleteWallet'),
+                      key: const Key('deleteWallet'),
                       onTap: !_walletOptions.isDefaultWallet
                           ? () async {
                               await _walletOptions.deleteWallet(
@@ -381,12 +381,12 @@ class CesiumWalletOptions extends StatelessWidget {
                             }
                           : null,
                       child: Row(children: <Widget>[
-                        SizedBox(width: 33),
+                        const SizedBox(width: 33),
                         Image.asset(
                           'assets/walletOptions/trash.png',
                         ),
-                        SizedBox(width: 14),
-                        Text('Supprimer ce portefeuille',
+                        const SizedBox(width: 14),
+                        const Text('Supprimer ce portefeuille',
                             style: TextStyle(
                                 fontSize: 20, color: Color(0xffD80000))),
                       ])),
diff --git a/lib/screens/myWallets/changePin.dart b/lib/screens/myWallets/change_pin.dart
similarity index 66%
rename from lib/screens/myWallets/changePin.dart
rename to lib/screens/myWallets/change_pin.dart
index 563b2478..2d51a046 100644
--- a/lib/screens/myWallets/changePin.dart
+++ b/lib/screens/myWallets/change_pin.dart
@@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/changePin.dart';
+import 'package:gecko/models/change_pin.dart';
 import 'dart:io';
 import 'package:provider/provider.dart';
 
@@ -13,7 +13,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
       {Key keyMyWallets, @required this.walletName, @required this.oldPin})
       : super(key: keyMyWallets);
   final String walletName;
-  final oldPin;
+  final String oldPin;
   Directory appPath;
   NewWallet _newWalletFile;
 
@@ -32,7 +32,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
             resizeToAvoidBottomInset: false,
             appBar: AppBar(
                 leading: IconButton(
-                    icon: Icon(Icons.arrow_back, color: Colors.black),
+                    icon: const Icon(Icons.arrow_back, color: Colors.black),
                     onPressed: () {
                       _changePin.newPin.text = '';
                       Navigator.of(context).pop();
@@ -44,7 +44,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
             body: Center(
                 child: SafeArea(
                     child: Column(children: <Widget>[
-              SizedBox(height: 80),
+              const SizedBox(height: 80),
               Text(
                 'Choisissez un code secret autogénéré :',
                 textAlign: TextAlign.center,
@@ -53,33 +53,31 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
                     color: Colors.grey[600],
                     fontWeight: FontWeight.w400),
               ),
-              SizedBox(height: 30),
-              Container(
-                child: Stack(
-                  alignment: Alignment.centerRight,
-                  children: <Widget>[
-                    TextField(
-                        enabled: true,
-                        controller: _changePin.newPin,
-                        maxLines: 1,
-                        textAlign: TextAlign.center,
-                        decoration: InputDecoration(),
-                        style: TextStyle(
-                            fontSize: 30.0,
-                            color: Colors.black,
-                            fontWeight: FontWeight.bold)),
-                    IconButton(
-                      icon: Icon(Icons.replay),
-                      color: orangeC,
-                      onPressed: () async {
-                        _newWalletFile =
-                            await _changePin.changePin(walletName, oldPin);
-                      },
-                    ),
-                  ],
-                ),
+              const SizedBox(height: 30),
+              Stack(
+                alignment: Alignment.centerRight,
+                children: <Widget>[
+                  TextField(
+                      enabled: true,
+                      controller: _changePin.newPin,
+                      maxLines: 1,
+                      textAlign: TextAlign.center,
+                      decoration: const InputDecoration(),
+                      style: const TextStyle(
+                          fontSize: 30.0,
+                          color: Colors.black,
+                          fontWeight: FontWeight.bold)),
+                  IconButton(
+                    icon: const Icon(Icons.replay),
+                    color: orangeC,
+                    onPressed: () async {
+                      _newWalletFile =
+                          await _changePin.changePin(walletName, oldPin);
+                    },
+                  ),
+                ],
               ),
-              SizedBox(height: 30),
+              const SizedBox(height: 30),
               SizedBox(
                 width: 200,
                 height: 50,
@@ -96,7 +94,8 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
                                 context, _newWalletFile);
                           }
                         : null,
-                    child: Text('Confirmer', style: TextStyle(fontSize: 28))),
+                    child: const Text('Confirmer',
+                        style: TextStyle(fontSize: 28))),
               )
             ])))));
   }
diff --git a/lib/screens/myWallets/chooseChest.dart b/lib/screens/myWallets/choose_chest.dart
similarity index 86%
rename from lib/screens/myWallets/chooseChest.dart
rename to lib/screens/myWallets/choose_chest.dart
index c26ec36f..479e0e48 100644
--- a/lib/screens/myWallets/chooseChest.dart
+++ b/lib/screens/myWallets/choose_chest.dart
@@ -1,7 +1,7 @@
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/screens/onBoarding/1.dart';
 import 'package:carousel_slider/carousel_slider.dart';
@@ -12,6 +12,8 @@ class ChooseChest extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   CarouselController buttonCarouselController = CarouselController();
 
+  ChooseChest({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -22,13 +24,13 @@ class ChooseChest extends StatelessWidget {
 
     return Scaffold(
         appBar: AppBar(
-            title: SizedBox(
+            title: const SizedBox(
           height: 22,
           child: Text('Sélectionner mon coffre'),
         )),
         body: SafeArea(
           child: Column(children: <Widget>[
-            SizedBox(height: 190),
+            const SizedBox(height: 190),
             CarouselSlider(
               carouselController: buttonCarouselController,
               options: CarouselOptions(
@@ -48,10 +50,10 @@ class ChooseChest extends StatelessWidget {
                       Image.asset(
                         'assets/chests/${i.value.imageName}',
                       ),
-                      SizedBox(height: 30),
+                      const SizedBox(height: 30),
                       Text(
                         i.value.name,
-                        style: TextStyle(fontSize: 21),
+                        style: const TextStyle(fontSize: 21),
                       ),
                     ]);
                   },
@@ -59,13 +61,13 @@ class ChooseChest extends StatelessWidget {
               }).toList(),
             ),
             Image.asset('assets/chests/vector.png'),
-            SizedBox(height: 15),
-            Text(
+            const SizedBox(height: 15),
+            const Text(
               'Choisir un autre\ncoffre',
               textAlign: TextAlign.center,
               style: TextStyle(fontSize: 13),
             ),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
             SizedBox(
               width: 400,
               height: 70,
@@ -91,9 +93,9 @@ class ChooseChest extends StatelessWidget {
                 ),
               ),
             ),
-            SizedBox(height: 20),
+            const SizedBox(height: 20),
             InkWell(
-                key: Key('createNewChest'),
+                key: const Key('createNewChest'),
                 onTap: () {
                   Navigator.push(
                     context,
@@ -110,7 +112,7 @@ class ChooseChest extends StatelessWidget {
                               color: orangeC,
                               fontWeight: FontWeight.w600))),
                 )),
-            SizedBox(height: 10),
+            const SizedBox(height: 10),
           ]),
         ));
   }
diff --git a/lib/screens/myWallets/confirmWalletStorage.dart b/lib/screens/myWallets/confirm_wallet_storage.dart
similarity index 82%
rename from lib/screens/myWallets/confirmWalletStorage.dart
rename to lib/screens/myWallets/confirm_wallet_storage.dart
index 02b02987..c31bbe7a 100644
--- a/lib/screens/myWallets/confirmWalletStorage.dart
+++ b/lib/screens/myWallets/confirm_wallet_storage.dart
@@ -3,9 +3,9 @@ import 'dart:async';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
-import 'package:gecko/models/generateWallets.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/generate_wallets.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:provider/provider.dart';
 
 // ignore: must_be_immutable
@@ -19,10 +19,10 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
   String generatedMnemonic;
   NewWallet generatedWallet;
 
-  TextEditingController _mnemonicController = TextEditingController();
-  TextEditingController _inputRestoreWord = TextEditingController();
+  final TextEditingController _mnemonicController = TextEditingController();
+  final TextEditingController _inputRestoreWord = TextEditingController();
   TextEditingController walletName = TextEditingController();
-  FocusNode _wordFocus = FocusNode();
+  final FocusNode _wordFocus = FocusNode();
 
   @override
   Widget build(BuildContext context) {
@@ -35,7 +35,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
         Provider.of<WalletOptionsProvider>(context);
     final int _currentChest = _myWalletProvider.getCurrentChest();
 
-    this._mnemonicController.text = generatedMnemonic;
+    _mnemonicController.text = generatedMnemonic;
     return WillPopScope(
         onWillPop: () {
           _generateWalletProvider.isAskedWordValid = false;
@@ -46,20 +46,20 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
           resizeToAvoidBottomInset: false,
           appBar: AppBar(
               leading: IconButton(
-                  icon: Icon(Icons.arrow_back, color: Colors.black),
+                  icon: const Icon(Icons.arrow_back, color: Colors.black),
                   onPressed: () {
                     Navigator.of(context).pop();
                     _generateWalletProvider.isAskedWordValid = false;
                     _generateWalletProvider.askedWordColor = Colors.black;
                   }),
-              title: SizedBox(
+              title: const SizedBox(
                 height: 22,
                 child: Text('Enregistrer ce trousseau'),
               )),
           body: Center(
             child: Column(children: <Widget>[
-              SizedBox(height: 15),
-              Container(
+              const SizedBox(height: 15),
+              SizedBox(
                   width: 360,
                   child: Text(
                     'Quel est le ${_generateWalletProvider.nbrWord + 1}ème mot de votre phrase de restauration ?',
@@ -70,11 +70,11 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                         fontWeight: FontWeight.w400),
                   )),
               TextFormField(
-                  key: Key('askedWord'),
+                  key: const Key('askedWord'),
                   focusNode: _wordFocus,
                   autofocus: true,
                   enabled: !_generateWalletProvider.isAskedWordValid,
-                  controller: this._inputRestoreWord,
+                  controller: _inputRestoreWord,
                   textInputAction: TextInputAction.next,
                   onChanged: (value) {
                     _generateWalletProvider.checkAskedWord(
@@ -82,13 +82,13 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                   },
                   maxLines: 1,
                   textAlign: TextAlign.center,
-                  decoration: InputDecoration(),
+                  decoration: const InputDecoration(),
                   style: TextStyle(
                       fontSize: 30.0,
                       color: _generateWalletProvider.askedWordColor,
                       fontWeight: FontWeight.w500)),
-              SizedBox(height: 12),
-              Container(
+              const SizedBox(height: 12),
+              SizedBox(
                   width: 360,
                   child: Text(
                     'Choisissez un nom pour votre premier portefeuille :',
@@ -99,21 +99,21 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                         fontWeight: FontWeight.w400),
                   )),
               TextFormField(
-                  key: Key('walletName'),
+                  key: const Key('walletName'),
                   focusNode: _generateWalletProvider.walletNameFocus,
                   inputFormatters: [
                     FilteringTextInputFormatter.allow(
                         RegExp('[A-Za-z|0-9|\\-|_| ]')),
                   ],
-                  controller: this.walletName,
+                  controller: walletName,
                   textInputAction: TextInputAction.next,
                   onChanged: (v) {
                     _generateWalletProvider.nameChanged();
                   },
                   maxLines: 1,
                   textAlign: TextAlign.center,
-                  decoration: InputDecoration(),
-                  style: TextStyle(
+                  decoration: const InputDecoration(),
+                  style: const TextStyle(
                       fontSize: 30.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w500)),
@@ -124,7 +124,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                         width: 200,
                         height: 50,
                         child: ElevatedButton(
-                            key: Key('confirmStorage'),
+                            key: const Key('confirmStorage'),
                             style: ElevatedButton.styleFrom(
                               elevation: 12,
                               primary: Colors
@@ -133,7 +133,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                             ),
                             onPressed: (_generateWalletProvider
                                         .isAskedWordValid &&
-                                    this.walletName.text != '')
+                                    walletName.text != '')
                                 ? () {
                                     _generateWalletProvider.storeHDWChest(
                                         generatedWallet,
@@ -154,12 +154,12 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                                         context, ModalRoute.withName('/'));
                                   }
                                 : null,
-                            child: Text('Confirmer',
+                            child: const Text('Confirmer',
                                 style: TextStyle(fontSize: 28))),
                       ))),
-              SizedBox(height: 70),
-              Text('TRICHE PENDANT ALPHA: ' + this._mnemonicController.text,
-                  style: TextStyle(
+              const SizedBox(height: 70),
+              Text('TRICHE PENDANT ALPHA: ' + _mnemonicController.text,
+                  style: const TextStyle(
                       fontSize: 10.0,
                       color: Colors.black,
                       fontWeight: FontWeight.normal)),
diff --git a/lib/screens/myWallets/generateWallets.dart b/lib/screens/myWallets/generate_wallets.dart
similarity index 70%
rename from lib/screens/myWallets/generateWallets.dart
rename to lib/screens/myWallets/generate_wallets.dart
index b1d623e3..8b7bd5e6 100644
--- a/lib/screens/myWallets/generateWallets.dart
+++ b/lib/screens/myWallets/generate_wallets.dart
@@ -1,7 +1,7 @@
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/generateWallets.dart';
-import 'package:gecko/screens/myWallets/confirmWalletStorage.dart';
+import 'package:gecko/models/generate_wallets.dart';
+import 'package:gecko/screens/myWallets/confirm_wallet_storage.dart';
 import 'package:flutter/material.dart';
 import 'package:printing/printing.dart';
 import 'package:provider/provider.dart';
@@ -15,8 +15,10 @@ class GenerateWalletsScreen extends StatelessWidget {
   String currentText = "";
   var pinColor = Colors.grey[300];
 
-  GlobalKey _toolTipSentence = GlobalKey();
-  GlobalKey _toolTipSecret = GlobalKey();
+  final GlobalKey _toolTipSentence = GlobalKey();
+  final GlobalKey _toolTipSecret = GlobalKey();
+
+  GenerateWalletsScreen({Key key}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -27,18 +29,18 @@ class GenerateWalletsScreen extends StatelessWidget {
 
     return Scaffold(
         appBar: AppBar(
-            title: SizedBox(
+            title: const SizedBox(
           height: 22,
           child: Text('Générer un trousseau'),
         )),
-        floatingActionButton: Container(
+        floatingActionButton: SizedBox(
             height: 80.0,
             width: 80.0,
             child: FittedBox(
                 child: FloatingActionButton(
               heroTag: "buttonGenerateWallet",
               onPressed: () => _generateWalletProvider.generateMnemonic(),
-              child: Container(
+              child: SizedBox(
                 height: 40.0,
                 width: 40.0,
                 child: Icon(Icons.replay, color: Colors.grey[850]),
@@ -49,7 +51,7 @@ class GenerateWalletsScreen extends StatelessWidget {
         body: Builder(
             builder: (ctx) => SafeArea(
                   child: Column(children: <Widget>[
-                    SizedBox(height: 20),
+                    const SizedBox(height: 20),
                     toolTips(_toolTipSentence, 'Phrase de restauration:',
                         "Notez et gardez cette phrase précieusement sur un papier, elle vous servira à restaurer votre portefeuille sur un autre appareil"),
                     TextField(
@@ -57,45 +59,43 @@ class GenerateWalletsScreen extends StatelessWidget {
                         controller: _generateWalletProvider.mnemonicController,
                         maxLines: 3,
                         textAlign: TextAlign.center,
-                        decoration: InputDecoration(
+                        decoration: const InputDecoration(
                           contentPadding: EdgeInsets.all(15.0),
                         ),
-                        style: TextStyle(
+                        style: const TextStyle(
                             fontSize: 22.0,
                             color: Colors.black,
                             fontWeight: FontWeight.w400)),
-                    SizedBox(height: 8),
+                    const SizedBox(height: 8),
                     toolTips(_toolTipSecret, 'Code secret:',
                         "Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"),
-                    Container(
-                      child: Stack(
-                        alignment: Alignment.centerRight,
-                        children: <Widget>[
-                          TextField(
-                              key: Key('generatedPin'),
-                              enabled: false,
-                              controller: _generateWalletProvider.pin,
-                              maxLines: 1,
-                              textAlign: TextAlign.center,
-                              decoration: InputDecoration(),
-                              style: TextStyle(
-                                  fontSize: 30.0,
-                                  color: Colors.black,
-                                  fontWeight: FontWeight.bold)),
-                          IconButton(
-                            icon: Icon(Icons.replay),
-                            color: orangeC,
-                            onPressed: () {
-                              _generateWalletProvider.changePinCode(
-                                  reload: false);
-                            },
-                          ),
-                        ],
-                      ),
+                    Stack(
+                      alignment: Alignment.centerRight,
+                      children: <Widget>[
+                        TextField(
+                            key: const Key('generatedPin'),
+                            enabled: false,
+                            controller: _generateWalletProvider.pin,
+                            maxLines: 1,
+                            textAlign: TextAlign.center,
+                            decoration: const InputDecoration(),
+                            style: const TextStyle(
+                                fontSize: 30.0,
+                                color: Colors.black,
+                                fontWeight: FontWeight.bold)),
+                        IconButton(
+                          icon: const Icon(Icons.replay),
+                          color: orangeC,
+                          onPressed: () {
+                            _generateWalletProvider.changePinCode(
+                                reload: false);
+                          },
+                        ),
+                      ],
                     ),
-                    SizedBox(height: 20),
+                    const SizedBox(height: 20),
                     ElevatedButton(
-                        key: Key('storeKeychain'),
+                        key: const Key('storeKeychain'),
                         style: ElevatedButton.styleFrom(
                           primary: yellowC, // background
                           onPrimary: Colors.black, // foreground
@@ -117,9 +117,9 @@ class GenerateWalletsScreen extends StatelessWidget {
                                 );
                               }
                             : null,
-                        child: Text('Enregistrer ce trousseau',
+                        child: const Text('Enregistrer ce trousseau',
                             style: TextStyle(fontSize: 20))),
-                    SizedBox(height: 20),
+                    const SizedBox(height: 20),
                     GestureDetector(
                         onTap: () {
                           Navigator.push(
@@ -130,7 +130,7 @@ class GenerateWalletsScreen extends StatelessWidget {
                             }),
                           );
                         },
-                        child: Icon(Icons.print))
+                        child: const Icon(Icons.print))
                   ]),
                 )));
   }
@@ -142,21 +142,21 @@ class GenerateWalletsScreen extends StatelessWidget {
           _toolTip.ensureTooltipVisible();
         },
         child: Tooltip(
-            padding: EdgeInsets.all(10),
+            padding: const EdgeInsets.all(10),
             key: _key,
-            showDuration: Duration(seconds: 5),
+            showDuration: const Duration(seconds: 5),
             message: _message,
             child: Row(
                 mainAxisAlignment: MainAxisAlignment.center,
                 children: <Widget>[
-                  SizedBox(width: 20),
+                  const SizedBox(width: 20),
                   Column(children: <Widget>[
                     SizedBox(
                         width: 30,
                         height: 25,
                         child:
                             Icon(Icons.info_outline, size: 22, color: orangeC)),
-                    SizedBox(height: 1)
+                    const SizedBox(height: 1)
                   ]),
                   Text(
                     _text,
@@ -165,14 +165,14 @@ class GenerateWalletsScreen extends StatelessWidget {
                         color: Colors.grey[600],
                         fontWeight: FontWeight.w400),
                   ),
-                  SizedBox(width: 45)
+                  const SizedBox(width: 45)
                 ])));
   }
 }
 
 // ignore: must_be_immutable
 class PrintWallet extends StatelessWidget {
-  PrintWallet(this.sentence);
+  const PrintWallet(this.sentence, {Key key}) : super(key: key);
 
   final String sentence;
 
@@ -182,7 +182,7 @@ class PrintWallet extends StatelessWidget {
         Provider.of<GenerateWalletsProvider>(context);
     return MaterialApp(
       home: Scaffold(
-        appBar: AppBar(title: Text('Imprimer ce trousseau')),
+        appBar: AppBar(title: const Text('Imprimer ce trousseau')),
         body: PdfPreview(
           build: (format) => _generateWalletProvider.printWallet(sentence),
         ),
diff --git a/lib/screens/myWallets/importWallet.dart b/lib/screens/myWallets/import_wallet.dart
similarity index 76%
rename from lib/screens/myWallets/importWallet.dart
rename to lib/screens/myWallets/import_wallet.dart
index d7c7b555..ed33ff4a 100644
--- a/lib/screens/myWallets/importWallet.dart
+++ b/lib/screens/myWallets/import_wallet.dart
@@ -1,13 +1,15 @@
 import 'dart:async';
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/generateWallets.dart';
+import 'package:gecko/models/generate_wallets.dart';
 import 'package:flutter/material.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:provider/provider.dart';
 
 class ImportWalletScreen extends StatelessWidget {
+  const ImportWalletScreen({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -28,25 +30,24 @@ class ImportWalletScreen extends StatelessWidget {
         child: Scaffold(
             appBar: AppBar(
                 leading: IconButton(
-                    icon: Icon(Icons.arrow_back, color: Colors.black),
+                    icon: const Icon(Icons.arrow_back, color: Colors.black),
                     onPressed: () {
                       _generateWalletProvider.resetImportView();
                       Navigator.of(context).pop();
                     }),
-                title: SizedBox(
+                title: const SizedBox(
                   height: 22,
                   child: Text('Importer un portefeuille'),
                 )),
             body: Builder(
                 builder: (ctx) => SafeArea(
                       child: Column(children: <Widget>[
-                        SizedBox(height: 20),
+                        const SizedBox(height: 20),
                         TextFormField(
                           onChanged: (text) {
-                            if (_debounce?.isActive ?? false)
-                              //   _generateWalletProvider.canImport = false;
-                              // _generateWalletProvider.reloadBuild();
+                            if (_debounce?.isActive ?? false) {
                               _debounce.cancel();
+                            }
                             _debounce =
                                 Timer(const Duration(milliseconds: 200), () {
                               _generateWalletProvider
@@ -77,13 +78,12 @@ class ImportWalletScreen extends StatelessWidget {
                             ),
                           ),
                         ),
-                        SizedBox(height: 15),
+                        const SizedBox(height: 15),
                         TextFormField(
                           onChanged: (text) {
-                            if (_debounce?.isActive ?? false)
-                              //   _generateWalletProvider.canImport = false;
-                              // _generateWalletProvider.reloadBuild();
+                            if (_debounce?.isActive ?? false) {
                               _debounce.cancel();
+                            }
                             _debounce =
                                 Timer(const Duration(milliseconds: 200), () {
                               _generateWalletProvider
@@ -115,7 +115,7 @@ class ImportWalletScreen extends StatelessWidget {
                             ),
                           ),
                         ),
-                        SizedBox(height: 15),
+                        const SizedBox(height: 15),
                         GestureDetector(
                             onTap: () {
                               Clipboard.setData(ClipboardData(
@@ -125,41 +125,39 @@ class ImportWalletScreen extends StatelessWidget {
                             },
                             child: Text(
                               _generateWalletProvider.cesiumPubkey.text,
-                              style: TextStyle(
+                              style: const TextStyle(
                                   fontSize: 14.0,
                                   color: Colors.black,
                                   fontWeight: FontWeight.bold,
                                   fontFamily: 'Monospace'),
                             )),
-                        SizedBox(height: 20),
+                        const SizedBox(height: 20),
                         toolTips(_toolTipSecret, 'Code secret:',
                             "Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"),
-                        Container(
-                          child: Stack(
-                            alignment: Alignment.centerRight,
-                            children: <Widget>[
-                              TextField(
-                                  enabled: false,
-                                  controller: _generateWalletProvider.pin,
-                                  maxLines: 1,
-                                  textAlign: TextAlign.center,
-                                  decoration: InputDecoration(),
-                                  style: TextStyle(
-                                      fontSize: 30.0,
-                                      color: Colors.black,
-                                      fontWeight: FontWeight.bold)),
-                              IconButton(
-                                icon: Icon(Icons.replay),
-                                color: orangeC,
-                                onPressed: () {
-                                  _generateWalletProvider.changePinCode(
-                                      reload: true);
-                                },
-                              ),
-                            ],
-                          ),
+                        Stack(
+                          alignment: Alignment.centerRight,
+                          children: <Widget>[
+                            TextField(
+                                enabled: false,
+                                controller: _generateWalletProvider.pin,
+                                maxLines: 1,
+                                textAlign: TextAlign.center,
+                                decoration: const InputDecoration(),
+                                style: const TextStyle(
+                                    fontSize: 30.0,
+                                    color: Colors.black,
+                                    fontWeight: FontWeight.bold)),
+                            IconButton(
+                              icon: const Icon(Icons.replay),
+                              color: orangeC,
+                              onPressed: () {
+                                _generateWalletProvider.changePinCode(
+                                    reload: true);
+                              },
+                            ),
+                          ],
                         ),
-                        SizedBox(height: 30),
+                        const SizedBox(height: 30),
                         ElevatedButton(
                             style: ElevatedButton.styleFrom(
                               primary: yellowC, // background
@@ -180,7 +178,7 @@ class ImportWalletScreen extends StatelessWidget {
                                     });
                                   }
                                 : null,
-                            child: Text('Importer ce portefeuille Cesium',
+                            child: const Text('Importer ce portefeuille Cesium',
                                 style: TextStyle(fontSize: 20))),
                       ]),
                     ))));
@@ -193,21 +191,21 @@ class ImportWalletScreen extends StatelessWidget {
           _toolTip.ensureTooltipVisible();
         },
         child: Tooltip(
-            padding: EdgeInsets.all(10),
+            padding: const EdgeInsets.all(10),
             key: _key,
-            showDuration: Duration(seconds: 5),
+            showDuration: const Duration(seconds: 5),
             message: _message,
             child: Row(
                 mainAxisAlignment: MainAxisAlignment.center,
                 children: <Widget>[
-                  SizedBox(width: 20),
+                  const SizedBox(width: 20),
                   Column(children: <Widget>[
                     SizedBox(
                         width: 30,
                         height: 25,
                         child:
                             Icon(Icons.info_outline, size: 22, color: orangeC)),
-                    SizedBox(height: 1)
+                    const SizedBox(height: 1)
                   ]),
                   Text(
                     _text,
@@ -216,7 +214,7 @@ class ImportWalletScreen extends StatelessWidget {
                         color: Colors.grey[600],
                         fontWeight: FontWeight.w400),
                   ),
-                  SizedBox(width: 45)
+                  const SizedBox(width: 45)
                 ])));
   }
 }
diff --git a/lib/screens/myWallets/unlockingWallet.dart b/lib/screens/myWallets/unlocking_wallet.dart
similarity index 87%
rename from lib/screens/myWallets/unlockingWallet.dart
rename to lib/screens/myWallets/unlocking_wallet.dart
index 33077175..7e810a23 100644
--- a/lib/screens/myWallets/unlockingWallet.dart
+++ b/lib/screens/myWallets/unlocking_wallet.dart
@@ -2,9 +2,9 @@ import 'dart:async';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/services.dart';
 import 'package:gecko/models/history.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:flutter/material.dart';
 import 'package:pin_code_fields/pin_code_fields.dart';
 import 'package:provider/provider.dart';
@@ -22,7 +22,7 @@ class UnlockingWallet extends StatelessWidget {
   StreamController<ErrorAnimationType> errorController;
   final formKey = GlobalKey<FormState>();
   bool hasError = false;
-  var pinColor = Color(0xffF9F9F1);
+  var pinColor = const Color(0xffF9F9F1);
   var walletPin = '';
   String resultPay;
 
@@ -42,11 +42,11 @@ class UnlockingWallet extends StatelessWidget {
         // backgroundColor: Colors.brown[600],
         body: SafeArea(
       child: Column(children: <Widget>[
-        SizedBox(height: 20),
+        const SizedBox(height: 20),
         Expanded(
           child: Column(children: <Widget>[
-            SizedBox(height: 150),
-            Text(
+            const SizedBox(height: 150),
+            const Text(
               'Veuillez tapper votre code secret pour dévérouiller votre portefeuille.',
               textAlign: TextAlign.center,
               style: TextStyle(
@@ -54,7 +54,7 @@ class UnlockingWallet extends StatelessWidget {
                   color: Colors.black,
                   fontWeight: FontWeight.w400),
             ),
-            SizedBox(height: 50),
+            const SizedBox(height: 50),
             pinForm(context, _pinLenght, wallet.number, wallet.derivation),
           ]),
         ),
@@ -106,14 +106,14 @@ class UnlockingWallet extends StatelessWidget {
               activeFillColor: hasError ? Colors.blueAccent : Colors.black,
             ),
             cursorColor: Colors.black,
-            animationDuration: Duration(milliseconds: 300),
-            textStyle: TextStyle(fontSize: 20, height: 1.6),
-            backgroundColor: Color(0xffF9F9F1),
+            animationDuration: const Duration(milliseconds: 300),
+            textStyle: const TextStyle(fontSize: 20, height: 1.6),
+            backgroundColor: const Color(0xffF9F9F1),
             enableActiveFill: false,
             errorAnimationController: errorController,
             controller: _enterPin,
             keyboardType: TextInputType.text,
-            boxShadows: [
+            boxShadows: const [
               BoxShadow(
                 offset: Offset(0, 1),
                 color: Colors.black12,
@@ -124,7 +124,7 @@ class UnlockingWallet extends StatelessWidget {
               log.d("Completed");
               _myWalletProvider.pinCode = _pin;
               final resultWallet = await _walletOptions.readLocalWallet(
-                  context, this.wallet, _pin.toUpperCase(), _pinLenght);
+                  context, wallet, _pin.toUpperCase(), _pinLenght);
               // _myWalletProvider.pinCode = _pin.toUpperCase();
               _myWalletProvider.pinLenght = _pinLenght;
 
@@ -140,7 +140,6 @@ class UnlockingWallet extends StatelessWidget {
                 if (action == "mywallets") {
                   Navigator.pushNamed(formKey.currentContext, '/mywallets');
                 } else if (action == "pay") {
-                  print("Go payments");
                   resultPay =
                       await _historyProvider.pay(context, _pin.toUpperCase());
                   await _paymentsResult(context);
@@ -148,8 +147,8 @@ class UnlockingWallet extends StatelessWidget {
               }
             },
             onChanged: (value) {
-              if (pinColor != Color(0xFFA4B600)) {
-                pinColor = Color(0xFFA4B600);
+              if (pinColor != const Color(0xFFA4B600)) {
+                pinColor = const Color(0xFFA4B600);
               }
             },
           )),
@@ -165,10 +164,10 @@ class UnlockingWallet extends StatelessWidget {
           title: Text(resultPay == "Success"
               ? 'Paiement effecuté avec succès !'
               : "Une erreur s'est produite lors du paiement"),
-          content: SingleChildScrollView(child: Text('')),
+          content: const SingleChildScrollView(child: Text('')),
           actions: <Widget>[
             TextButton(
-              child: Text("OK"),
+              child: const Text("OK"),
               onPressed: () {
                 Navigator.popUntil(
                   context,
diff --git a/lib/screens/myWallets/walletOptions.dart b/lib/screens/myWallets/wallet_options.dart
similarity index 88%
rename from lib/screens/myWallets/walletOptions.dart
rename to lib/screens/myWallets/wallet_options.dart
index dfc28b3a..7efbf30f 100644
--- a/lib/screens/myWallets/walletOptions.dart
+++ b/lib/screens/myWallets/wallet_options.dart
@@ -3,10 +3,10 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
 import 'package:gecko/models/history.dart';
-import 'package:gecko/models/myWallets.dart';
+import 'package:gecko/models/my_wallets.dart';
 import 'package:gecko/models/queries.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:provider/provider.dart';
 import 'package:flutter/services.dart';
@@ -42,8 +42,9 @@ class WalletOptions extends StatelessWidget {
     _walletOptions.nameController.text.length >= 15
         ? _nbrLinesName = 2
         : _nbrLinesName = 1;
-    if (_walletOptions.nameController.text.length >= 26 && isTall)
+    if (_walletOptions.nameController.text.length >= 26 && isTall) {
       _nbrLinesName = 3;
+    }
 
     _walletOptions.walletID = [0, wallet.number];
 
@@ -71,7 +72,7 @@ class WalletOptions extends StatelessWidget {
           resizeToAvoidBottomInset: false,
           appBar: AppBar(
               leading: IconButton(
-                  icon: Icon(Icons.arrow_back, color: Colors.black),
+                  icon: const Icon(Icons.arrow_back, color: Colors.black),
                   onPressed: () {
                     _walletOptions.isEditing = false;
                     _walletOptions.isBalanceBlur = true;
@@ -98,11 +99,11 @@ class WalletOptions extends StatelessWidget {
                       end: Alignment.bottomCenter,
                       colors: [
                         yellowC,
-                        Color(0xfffafafa),
+                        const Color(0xfffafafa),
                       ],
                     )),
                     child: Row(children: <Widget>[
-                      SizedBox(width: 25),
+                      const SizedBox(width: 25),
                       InkWell(
                           onTap: () async {
                             await _walletOptions.changeAvatar();
@@ -119,7 +120,7 @@ class WalletOptions extends StatelessWidget {
                             Image.asset(
                               'assets/walletOptions/camera.png',
                             ),
-                            SizedBox(height: 100)
+                            const SizedBox(height: 100)
                           ])),
                       Column(children: <Widget>[
                         Row(children: <Widget>[
@@ -127,14 +128,14 @@ class WalletOptions extends StatelessWidget {
                             SizedBox(
                               width: 260,
                               child: TextField(
-                                  key: Key('walletName'),
+                                  key: const Key('walletName'),
                                   autofocus: false,
                                   focusNode: _walletOptions.walletNameFocus,
                                   enabled: _walletOptions.isEditing,
                                   controller: _walletOptions.nameController,
                                   maxLines: _nbrLinesName,
                                   textAlign: TextAlign.center,
-                                  decoration: InputDecoration(
+                                  decoration: const InputDecoration(
                                     border: InputBorder.none,
                                     focusedBorder: InputBorder.none,
                                     enabledBorder: InputBorder.none,
@@ -163,7 +164,7 @@ class WalletOptions extends StatelessWidget {
                                 }
 
                                 if (result.isLoading) {
-                                  return Text('Loading');
+                                  return const Text('Loading');
                                 }
 
                                 // List repositories = result.data['viewer']['repositories']['nodes'];
@@ -190,7 +191,7 @@ class WalletOptions extends StatelessWidget {
                                         sigmaY: _walletOptions.isBalanceBlur
                                             ? 5
                                             : 0),
-                                    child: Text('$wBalanceUD',
+                                    child: Text(wBalanceUD,
                                         style: TextStyle(
                                             fontSize: isTall ? 20 : 18,
                                             color: Colors.black)),
@@ -208,9 +209,9 @@ class WalletOptions extends StatelessWidget {
                                 // );
                               },
                             ),
-                            SizedBox(height: 5),
+                            const SizedBox(height: 5),
                             InkWell(
-                                key: Key('displayBalance'),
+                                key: const Key('displayBalance'),
                                 onTap: () {
                                   _walletOptions.bluringBalance();
                                 },
@@ -220,15 +221,15 @@ class WalletOptions extends StatelessWidget {
                                       : 'assets/walletOptions/icon_oeuil_close.png',
                                 )),
                           ]),
-                          SizedBox(width: 0),
+                          const SizedBox(width: 0),
                           Column(children: <Widget>[
                             InkWell(
-                                key: Key('renameWallet'),
+                                key: const Key('renameWallet'),
                                 onTap: () async {
                                   _isNewNameValid = _walletOptions
                                       .editWalletName(_walletOptions.walletID);
                                   await Future.delayed(
-                                      Duration(milliseconds: 30));
+                                      const Duration(milliseconds: 30));
                                   _walletOptions.walletNameFocus.requestFocus();
                                 },
                                 child: ClipRRect(
@@ -239,7 +240,7 @@ class WalletOptions extends StatelessWidget {
                                       width: 20,
                                       height: 20),
                                 )),
-                            SizedBox(
+                            const SizedBox(
                               height: 60,
                             )
                           ])
@@ -254,11 +255,11 @@ class WalletOptions extends StatelessWidget {
                       return snapshot.data != null
                           ? Image.memory(snapshot.data,
                               height: isTall ? 300 : 270)
-                          : Text('-', style: TextStyle(fontSize: 20));
+                          : const Text('-', style: TextStyle(fontSize: 20));
                     }),
                 SizedBox(height: 15 * ratio),
                 GestureDetector(
-                    key: Key('copyPubkey'),
+                    key: const Key('copyPubkey'),
                     onTap: () {
                       Clipboard.setData(
                           ClipboardData(text: _walletOptions.pubkey.text));
@@ -267,30 +268,29 @@ class WalletOptions extends StatelessWidget {
                     child: SizedBox(
                         height: 50,
                         child: Row(children: <Widget>[
-                          SizedBox(width: 30),
+                          const SizedBox(width: 30),
                           Image.asset(
                             'assets/walletOptions/key.png',
                           ),
-                          SizedBox(width: 10),
+                          const SizedBox(width: 10),
                           Text("${shortPubkey.split(':')[0]}:",
-                              style: TextStyle(
+                              style: const TextStyle(
                                   fontSize: 22,
                                   fontWeight: FontWeight.w800,
                                   fontFamily: 'Monospace',
                                   color: Colors.black)),
                           Text(shortPubkey.split(':')[1],
-                              style: TextStyle(
+                              style: const TextStyle(
                                   fontSize: 22,
                                   fontWeight: FontWeight.w800,
                                   fontFamily: 'Monospace')),
-                          SizedBox(width: 15),
+                          const SizedBox(width: 15),
                           SizedBox(
                               height: 40,
                               child: ElevatedButton(
                                   style: ElevatedButton.styleFrom(
                                     shape: RoundedRectangleBorder(
-                                      borderRadius:
-                                          new BorderRadius.circular(8),
+                                      borderRadius: BorderRadius.circular(8),
                                     ),
                                     elevation: 1,
                                     primary: orangeC, // background
@@ -305,7 +305,7 @@ class WalletOptions extends StatelessWidget {
                                     Image.asset(
                                       'assets/walletOptions/copy-white.png',
                                     ),
-                                    SizedBox(width: 7),
+                                    const SizedBox(width: 7),
                                     Text('Copier',
                                         style: TextStyle(
                                             fontSize: 15,
@@ -314,7 +314,7 @@ class WalletOptions extends StatelessWidget {
                         ]))),
                 SizedBox(height: 10 * ratio),
                 InkWell(
-                    key: Key('displayHistory'),
+                    key: const Key('displayHistory'),
                     onTap: () {
                       _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text,
                           goHistory: true);
@@ -322,18 +322,18 @@ class WalletOptions extends StatelessWidget {
                     child: SizedBox(
                         height: 50,
                         child: Row(children: <Widget>[
-                          SizedBox(width: 30),
+                          const SizedBox(width: 30),
                           Image.asset(
                             'assets/walletOptions/clock.png',
                           ),
-                          SizedBox(width: 12),
-                          Text('Historique des transactions',
+                          const SizedBox(width: 12),
+                          const Text('Historique des transactions',
                               style:
                                   TextStyle(fontSize: 20, color: Colors.black)),
                         ]))),
                 SizedBox(height: 12 * ratio),
                 InkWell(
-                    key: Key('setDefaultWallet'),
+                    key: const Key('setDefaultWallet'),
                     onTap: !_walletOptions.isDefaultWallet
                         ? () {
                             defaultWallet = wallet;
@@ -346,14 +346,14 @@ class WalletOptions extends StatelessWidget {
                     child: SizedBox(
                         height: 50,
                         child: Row(children: <Widget>[
-                          SizedBox(width: 31),
+                          const SizedBox(width: 31),
                           CircleAvatar(
                               backgroundColor: Colors.grey[
                                   _walletOptions.isDefaultWallet ? 300 : 500],
                               child: Image.asset(
                                 'assets/walletOptions/android-checkmark.png',
                               )),
-                          SizedBox(width: 12),
+                          const SizedBox(width: 12),
                           Text(
                               _walletOptions.isDefaultWallet
                                   ? 'Ce portefeuille est celui par defaut'
@@ -367,7 +367,7 @@ class WalletOptions extends StatelessWidget {
                 SizedBox(height: 17 * ratio),
                 if (!_walletOptions.isDefaultWallet)
                   InkWell(
-                      key: Key('deleteWallet'),
+                      key: const Key('deleteWallet'),
                       onTap: !_walletOptions.isDefaultWallet
                           ? () async {
                               await _walletOptions.deleteWallet(
@@ -381,12 +381,12 @@ class WalletOptions extends StatelessWidget {
                             }
                           : null,
                       child: Row(children: <Widget>[
-                        SizedBox(width: 33),
+                        const SizedBox(width: 33),
                         Image.asset(
                           'assets/walletOptions/trash.png',
                         ),
-                        SizedBox(width: 14),
-                        Text('Supprimer ce portefeuille',
+                        const SizedBox(width: 14),
+                        const Text('Supprimer ce portefeuille',
                             style: TextStyle(
                                 fontSize: 20, color: Color(0xffD80000))),
                       ])),
diff --git a/lib/screens/myWallets/walletsHome.dart b/lib/screens/myWallets/wallets_home.dart
similarity index 83%
rename from lib/screens/myWallets/walletsHome.dart
rename to lib/screens/myWallets/wallets_home.dart
index 350b771a..81b5be9f 100644
--- a/lib/screens/myWallets/walletsHome.dart
+++ b/lib/screens/myWallets/wallets_home.dart
@@ -1,21 +1,23 @@
 import 'package:flutter/services.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/chestData.dart';
-import 'package:gecko/models/myWallets.dart';
+import 'package:gecko/models/chest_data.dart';
+import 'package:gecko/models/my_wallets.dart';
 import 'package:gecko/models/queries.dart';
-import 'package:gecko/models/walletData.dart';
-import 'package:gecko/models/walletOptions.dart';
+import 'package:gecko/models/wallet_data.dart';
+import 'package:gecko/models/wallet_options.dart';
 import 'package:flutter/material.dart';
-import 'package:gecko/screens/commonElements.dart';
-import 'package:gecko/screens/myWallets/chooseChest.dart';
-import 'package:gecko/screens/myWallets/walletOptions.dart';
-import 'package:gecko/screens/onBoarding/0_noKeychainFound.dart';
+import 'package:gecko/screens/common_elements.dart';
+import 'package:gecko/screens/myWallets/choose_chest.dart';
+import 'package:gecko/screens/myWallets/wallet_options.dart';
+import 'package:gecko/screens/onBoarding/0_no_keychain_found.dart';
 import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:provider/provider.dart';
 
 class WalletsHome extends StatelessWidget {
   final _derivationKey = GlobalKey<FormState>();
 
+  WalletsHome({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -43,7 +45,7 @@ class WalletsHome extends StatelessWidget {
       child: Scaffold(
         appBar: AppBar(
           leading: IconButton(
-              icon: Icon(Icons.arrow_back, color: Colors.black),
+              icon: const Icon(Icons.arrow_back, color: Colors.black),
               onPressed: () {
                 Navigator.popUntil(
                   context,
@@ -51,12 +53,13 @@ class WalletsHome extends StatelessWidget {
                 );
               }),
           title: Text(_currentChest.name,
-              key: Key('myWallets'), style: TextStyle(color: Colors.grey[850])),
-          backgroundColor: Color(0xffFFD58D),
+              key: const Key('myWallets'),
+              style: TextStyle(color: Colors.grey[850])),
+          backgroundColor: const Color(0xffFFD58D),
         ),
         body: SafeArea(
           child: !isWalletsExists
-              ? NoKeyChainScreen()
+              ? const NoKeyChainScreen()
               : _currentChest.isCesium
                   ? cesiumWalletOptions(context)
                   : myWalletsTiles(context),
@@ -66,14 +69,14 @@ class WalletsHome extends StatelessWidget {
   }
 
   Widget cesiumWalletOptions(BuildContext context) {
-    return Column(children: [
+    return Column(children: const [
       Center(child: Text('This is a Cesium wallet')),
     ]);
   }
 
   Widget chestOptions(BuildContext context) {
     return Column(children: [
-      SizedBox(height: 50),
+      const SizedBox(height: 50),
       SizedBox(
           height: 120,
           width: 445,
@@ -87,7 +90,7 @@ class WalletsHome extends StatelessWidget {
               onPrimary: Colors.black, // foreground
             ),
             onPressed: () => null,
-            label: Text(
+            label: const Text(
               "       Paramétrer ce coffre",
               style: TextStyle(
                 fontSize: 25,
@@ -96,7 +99,7 @@ class WalletsHome extends StatelessWidget {
               ),
             ),
           )),
-      SizedBox(height: 30),
+      const SizedBox(height: 30),
       SizedBox(
           height: 120,
           width: 445,
@@ -113,7 +116,7 @@ class WalletsHome extends StatelessWidget {
                 return ChooseChest();
               }),
             ),
-            label: Text(
+            label: const Text(
               "       Changer de coffre",
               style: TextStyle(
                 fontSize: 25,
@@ -122,7 +125,7 @@ class WalletsHome extends StatelessWidget {
               ),
             ),
           )),
-      SizedBox(height: 30)
+      const SizedBox(height: 30)
     ]);
   }
 
@@ -135,12 +138,12 @@ class WalletsHome extends StatelessWidget {
     final bool isWalletsExists = _myWalletProvider.checkIfWalletExist();
 
     if (!isWalletsExists) {
-      return Text('');
+      return const Text('');
     }
 
     if (_myWalletProvider.listWallets.isEmpty) {
       return Expanded(
-          child: Column(children: <Widget>[
+          child: Column(children: const <Widget>[
         Center(
             child: Text(
           'Veuillez générer votre premier portefeuille',
@@ -154,9 +157,9 @@ class WalletsHome extends StatelessWidget {
         _myWalletProvider.getDefaultWallet(configBox.get('currentChest'));
 
     return CustomScrollView(slivers: <Widget>[
-      SliverToBoxAdapter(child: SizedBox(height: 20)),
+      const SliverToBoxAdapter(child: SizedBox(height: 20)),
       SliverGrid.count(
-          key: Key('listWallets'),
+          key: const Key('listWallets'),
           crossAxisCount: 2,
           childAspectRatio: 1,
           crossAxisSpacing: 0,
@@ -164,7 +167,7 @@ class WalletsHome extends StatelessWidget {
           children: <Widget>[
             for (WalletData _repository in _listWallets)
               Padding(
-                  padding: EdgeInsets.all(16),
+                  padding: const EdgeInsets.all(16),
                   child: GestureDetector(
                     onTap: () async {
                       await _walletOptions.readLocalWallet(
@@ -185,14 +188,15 @@ class WalletsHome extends StatelessWidget {
                       // }));
                     },
                     child: ClipOvalShadow(
-                      shadow: Shadow(
+                      shadow: const Shadow(
                         color: Colors.transparent,
                         offset: Offset(0, 0),
                         blurRadius: 5,
                       ),
                       clipper: CustomClipperOval(),
                       child: ClipRRect(
-                        borderRadius: BorderRadius.all(Radius.circular(12)),
+                        borderRadius:
+                            const BorderRadius.all(Radius.circular(12)),
                         child: Column(children: <Widget>[
                           Expanded(
                               child: Container(
@@ -203,7 +207,7 @@ class WalletsHome extends StatelessWidget {
                               radius: 0.6,
                               colors: [
                                 Colors.green[400],
-                                Color(0xFFE7E7A6),
+                                const Color(0xFFE7E7A6),
                               ],
                             )),
                             child:
@@ -217,29 +221,30 @@ class WalletsHome extends StatelessWidget {
                           )),
                           // balanceBuilder(context, _walletOptions.pubkey.text),
                           ListTile(
-                            shape: RoundedRectangleBorder(
+                            shape: const RoundedRectangleBorder(
                                 borderRadius: BorderRadius.vertical(
                                     bottom: Radius.circular(12))),
                             // contentPadding: const EdgeInsets.only(left: 7.0),
                             tileColor:
                                 _repository.id()[1] == defaultWallet.id()[1]
                                     ? orangeC
-                                    : Color(0xffFFD58D),
+                                    : const Color(0xffFFD58D),
                             // leading: Text('IMAGE'),
 
                             // subtitle: Text(_repository.split(':')[3],
                             //     style: TextStyle(fontSize: 12.0, fontFamily: 'Monospace')),
                             title: Center(
                               child: Padding(
-                                padding: EdgeInsets.symmetric(horizontal: 5),
+                                padding:
+                                    const EdgeInsets.symmetric(horizontal: 5),
                                 child: Text(
-                                  '${_repository.name}',
+                                  _repository.name,
                                   textAlign: TextAlign.center,
                                   style: TextStyle(
                                       fontSize: 17.0,
                                       color: _repository.id()[1] ==
                                               defaultWallet.id()[1]
-                                          ? Color(0xffF9F9F1)
+                                          ? const Color(0xffF9F9F1)
                                           : Colors.black,
                                       fontStyle: FontStyle.italic),
                                 ),
@@ -292,7 +297,7 @@ class WalletsHome extends StatelessWidget {
           }
 
           if (result.isLoading) {
-            return Text('Loading');
+            return const Text('Loading');
           }
           String wBalanceUD;
           if (result.data['balance'] == null) {
@@ -310,13 +315,13 @@ class WalletsHome extends StatelessWidget {
 
   Widget addNewDerivation(context) {
     return Padding(
-        padding: EdgeInsets.all(16),
+        padding: const EdgeInsets.all(16),
         child: ClipRRect(
-            borderRadius: BorderRadius.all(Radius.circular(12)),
+            borderRadius: const BorderRadius.all(Radius.circular(12)),
             child: Column(children: <Widget>[
               Expanded(
                 child: InkWell(
-                    key: Key('addDerivation'),
+                    key: const Key('addDerivation'),
                     onTap: () {
                       showDialog(
                           context: context,
@@ -328,7 +333,7 @@ class WalletsHome extends StatelessWidget {
                       width: double.infinity,
                       height: double.infinity,
                       decoration: BoxDecoration(color: floattingYellow),
-                      child: Center(
+                      child: const Center(
                           child: Text(
                         '+',
                         style: TextStyle(
@@ -355,21 +360,21 @@ class WalletsHome extends StatelessWidget {
             child: Column(
               mainAxisSize: MainAxisSize.min,
               children: <Widget>[
-                Text('Nom du portefeuille:'),
+                const Text('Nom du portefeuille:'),
                 Padding(
-                  padding: EdgeInsets.all(8.0),
+                  padding: const EdgeInsets.all(8.0),
                   child: TextFormField(
-                    key: Key('DerivationNameKey'),
+                    key: const Key('DerivationNameKey'),
                     controller: _newDerivationName,
                     textAlign: TextAlign.center,
                     autofocus: true,
                   ),
                 ),
-                SizedBox(height: 20),
+                const SizedBox(height: 20),
                 Padding(
                   padding: const EdgeInsets.all(8.0),
                   child: ElevatedButton(
-                      key: Key('validDerivation'),
+                      key: const Key('validDerivation'),
                       style: ElevatedButton.styleFrom(
                         elevation: 1,
                         primary: yellowC, // background
@@ -381,7 +386,7 @@ class WalletsHome extends StatelessWidget {
                                 context, _newDerivationName.text)
                             .then((_) => _newDerivationName.text == '');
                       },
-                      child: Text("Créer")),
+                      child: const Text("Créer")),
                 )
               ],
             ),
@@ -402,7 +407,7 @@ class CustomClipperOval extends CustomClipper<Rect> {
   @override
   Rect getClip(Size size) {
     return Rect.fromCircle(
-        center: new Offset(size.width / 2, size.width / 2),
+        center: Offset(size.width / 2, size.width / 2),
         radius: size.width / 2 + 3);
   }
 
@@ -417,20 +422,21 @@ class ClipOvalShadow extends StatelessWidget {
   final CustomClipper<Rect> clipper;
   final Widget child;
 
-  ClipOvalShadow({
+  const ClipOvalShadow({
+    Key key,
     @required this.shadow,
     @required this.clipper,
     @required this.child,
-  });
+  }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
     return CustomPaint(
       painter: _ClipOvalShadowPainter(
-        clipper: this.clipper,
-        shadow: this.shadow,
+        clipper: clipper,
+        shadow: shadow,
       ),
-      child: ClipRect(child: child, clipper: this.clipper),
+      child: ClipRect(child: child, clipper: clipper),
     );
   }
 }
@@ -444,7 +450,7 @@ class _ClipOvalShadowPainter extends CustomPainter {
   @override
   void paint(Canvas canvas, Size size) {
     var paint = shadow.toPaint();
-    var clipRect = clipper.getClip(size).shift(Offset(0, 0));
+    var clipRect = clipper.getClip(size).shift(const Offset(0, 0));
     canvas.drawOval(clipRect, paint);
   }
 
diff --git a/lib/screens/onBoarding/0_noKeychainFound.dart b/lib/screens/onBoarding/0_no_keychain_found.dart
similarity index 79%
rename from lib/screens/onBoarding/0_noKeychainFound.dart
rename to lib/screens/onBoarding/0_no_keychain_found.dart
index c69d4d66..31745a7f 100644
--- a/lib/screens/onBoarding/0_noKeychainFound.dart
+++ b/lib/screens/onBoarding/0_no_keychain_found.dart
@@ -1,16 +1,14 @@
+// ignore_for_file: file_names
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_svg/flutter_svg.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
-import 'package:gecko/screens/myWallets/importWallet.dart';
+import 'package:gecko/screens/common_elements.dart';
+import 'package:gecko/screens/myWallets/import_wallet.dart';
 import 'package:gecko/screens/onBoarding/1.dart';
-// import 'package:gecko/models/home.dart';
-// import 'package:provider/provider.dart';
 
-// ignore: must_be_immutable
 class NoKeyChainScreen extends StatelessWidget {
-  TextEditingController tplController = TextEditingController();
+  const NoKeyChainScreen({Key key}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -25,16 +23,16 @@ class NoKeyChainScreen extends StatelessWidget {
             common.onboardingProgressBar(context, 'Mes portefeuilles', 0),
             common.bubbleSpeak(
                 "Je ne connais pour l’instant aucun de vos portefeuilles.\n\nVous pouvez en créer un nouveau, ou bien importer un portefeuille Cesium existant.",
-                textKey: Key('textOnboarding')),
-            SizedBox(height: 90),
+                textKey: const Key('textOnboarding')),
+            const SizedBox(height: 90),
             Container(
               child: ClipOval(
                 child: Material(
-                  color: Color(0xffFFD58D), // button color
+                  color: const Color(0xffFFD58D), // button color
                   child: InkWell(
-                      key: Key('goStep1'),
+                      key: const Key('goStep1'),
                       splashColor: orangeC, // inkwell color
-                      child: Padding(
+                      child: const Padding(
                           padding: EdgeInsets.all(8),
                           child: Image(
                               image: AssetImage('assets/onBoarding/wallet.png'),
@@ -47,7 +45,7 @@ class NoKeyChainScreen extends StatelessWidget {
                       }),
                 ),
               ),
-              decoration: BoxDecoration(
+              decoration: const BoxDecoration(
                 shape: BoxShape.circle,
                 color: Colors.white,
                 boxShadow: [
@@ -59,8 +57,8 @@ class NoKeyChainScreen extends StatelessWidget {
                 ],
               ),
             ),
-            SizedBox(height: 15),
-            Text(
+            const SizedBox(height: 15),
+            const Text(
               "Créer un nouveau\nportefeuille",
               textAlign: TextAlign.center,
               style: TextStyle(
@@ -68,15 +66,15 @@ class NoKeyChainScreen extends StatelessWidget {
                   fontSize: 16,
                   fontWeight: FontWeight.w500),
             ),
-            SizedBox(height: 70),
+            const SizedBox(height: 70),
             Container(
               child: ClipOval(
                 child: Material(
-                  color: Color(0xffFFD58D), // button color
+                  color: const Color(0xffFFD58D), // button color
                   child: InkWell(
                       splashColor: orangeC, // inkwell color
                       child: Padding(
-                        padding: EdgeInsets.all(12),
+                        padding: const EdgeInsets.all(12),
                         child:
                             // Image(
                             // image: AssetImage('assets/cesium_bw3.png'),
@@ -86,11 +84,11 @@ class NoKeyChainScreen extends StatelessWidget {
                       ),
                       onTap: () {
                         Navigator.push(context,
-                            SlideLeftRoute(page: ImportWalletScreen()));
+                            SlideLeftRoute(page: const ImportWalletScreen()));
                       }),
                 ),
               ),
-              decoration: BoxDecoration(
+              decoration: const BoxDecoration(
                 shape: BoxShape.circle,
                 color: Colors.white,
                 boxShadow: [
@@ -102,8 +100,8 @@ class NoKeyChainScreen extends StatelessWidget {
                 ],
               ),
             ),
-            SizedBox(height: 10),
-            Text(
+            const SizedBox(height: 10),
+            const Text(
               "Importer un\nportefeuille Cesium",
               textAlign: TextAlign.center,
               style: TextStyle(color: Colors.black, fontSize: 13),
diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart
index d58c8a34..6cbd97c6 100644
--- a/lib/screens/onBoarding/1.dart
+++ b/lib/screens/onBoarding/1.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/2.dart';
 // import 'package:gecko/models/home.dart';
 // import 'package:provider/provider.dart';
@@ -11,6 +13,8 @@ class OnboardingStepOne extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 1;
 
+  OnboardingStepOne({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -24,8 +28,8 @@ class OnboardingStepOne extends StatelessWidget {
                 context, 'Nouveau portefeuilles', progress),
             common.bubbleSpeak(
                 "Il semblerait que vous n’ayez pas encore de trousseau.\n\nUn trousseau vous permet de gérer un ou plusieurs portefeuilles.",
-                textKey: Key('step1')),
-            SizedBox(height: 90),
+                textKey: const Key('step1')),
+            const SizedBox(height: 90),
             Image.asset(
               'assets/onBoarding/keys-and-wallets-horizontal.png',
               height: 200,
@@ -37,7 +41,7 @@ class OnboardingStepOne extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goStep2'),
+                          key: const Key('goStep2'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -49,10 +53,10 @@ class OnboardingStepOne extends StatelessWidget {
                                 FaderTransition(
                                     page: OnboardingStepTwo(), isFast: true));
                           },
-                          child: Text('Créer mon trousseau',
+                          child: const Text('Créer mon trousseau',
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart
index 12c82117..8a928690 100644
--- a/lib/screens/onBoarding/10.dart
+++ b/lib/screens/onBoarding/10.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/11.dart';
 
 // ignore: must_be_immutable
@@ -9,6 +11,8 @@ class OnboardingStepTwelve extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 9;
 
+  OnboardingStepTwelve({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -22,9 +26,9 @@ class OnboardingStepTwelve extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "Si un jour vous changez de téléphone, votre code secret sera différent, mais il vous suffira de me redonner votre phrase de restauration pour recréer votre trousseau.",
-              textKey: Key('step10'),
+              textKey: const Key('step10'),
             ),
-            SizedBox(height: 10),
+            const SizedBox(height: 10),
             Image.asset(
               'assets/onBoarding/plusieurs-codes-secrets-un-trousseau.png',
               height: 410 * ratio,
@@ -36,7 +40,7 @@ class OnboardingStepTwelve extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goStep11'),
+                          key: const Key('goStep11'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -49,7 +53,7 @@ class OnboardingStepTwelve extends StatelessWidget {
                                   page: OnboardingStepThirteen(), isFast: true),
                             );
                           },
-                          child: Text("Générer le code secret",
+                          child: const Text("Générer le code secret",
                               style: TextStyle(fontSize: 20))),
                     ))),
             SizedBox(height: isTall ? 80 : 40),
diff --git a/lib/screens/onBoarding/11.dart b/lib/screens/onBoarding/11.dart
index d0173cc7..38cc3308 100644
--- a/lib/screens/onBoarding/11.dart
+++ b/lib/screens/onBoarding/11.dart
@@ -1,10 +1,12 @@
+// ignore_for_file: file_names
+
 import 'dart:ui';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/generateWallets.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/models/generate_wallets.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/12.dart';
 import 'package:provider/provider.dart';
 
@@ -13,6 +15,8 @@ class OnboardingStepThirteen extends StatelessWidget {
   NewWallet generatedWallet;
   final int progress = 10;
 
+  OnboardingStepThirteen({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -32,51 +36,49 @@ class OnboardingStepThirteen extends StatelessWidget {
                 // initialData: '...',
                 builder: (context, snapshot) {
                   generatedWallet = snapshot.data;
-                  return Visibility(visible: false, child: Text(''));
+                  return const Visibility(visible: false, child: Text(''));
                 }),
             common.onboardingProgressBar(
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeakRich(
               <TextSpan>[
-                TextSpan(
+                const TextSpan(
                     text:
                         "Et voilà votre code secret !\n\nMémorisez-le ou notez-le, car il vous sera demandé "),
-                TextSpan(
+                const TextSpan(
                     text: 'à chaque fois',
                     style: TextStyle(fontWeight: FontWeight.bold)),
-                TextSpan(
+                const TextSpan(
                     text:
                         " que vous voudrez effectuer un paiement sur cet appareil."),
               ],
-              textKey: Key('step11'),
+              textKey: const Key('step11'),
             ),
-            SizedBox(height: 100),
-            Container(
-              child: Stack(
-                alignment: Alignment.centerRight,
-                children: <Widget>[
-                  TextField(
-                      key: Key('generatedPin'),
-                      enabled: false,
-                      controller: _generateWalletProvider.pin,
-                      maxLines: 1,
-                      textAlign: TextAlign.center,
-                      decoration: InputDecoration(),
-                      style: TextStyle(
-                          letterSpacing: 5,
-                          fontSize: 35.0,
-                          color: Colors.black,
-                          fontWeight: FontWeight.bold)),
-                  IconButton(
-                    icon: Icon(Icons.replay),
-                    color: orangeC,
-                    onPressed: () async {
-                      generatedWallet = await _generateWalletProvider
-                          .changePinCode(reload: false);
-                    },
-                  ),
-                ],
-              ),
+            const SizedBox(height: 100),
+            Stack(
+              alignment: Alignment.centerRight,
+              children: <Widget>[
+                TextField(
+                    key: const Key('generatedPin'),
+                    enabled: false,
+                    controller: _generateWalletProvider.pin,
+                    maxLines: 1,
+                    textAlign: TextAlign.center,
+                    decoration: const InputDecoration(),
+                    style: const TextStyle(
+                        letterSpacing: 5,
+                        fontSize: 35.0,
+                        color: Colors.black,
+                        fontWeight: FontWeight.bold)),
+                IconButton(
+                  icon: const Icon(Icons.replay),
+                  color: orangeC,
+                  onPressed: () async {
+                    generatedWallet = await _generateWalletProvider
+                        .changePinCode(reload: false);
+                  },
+                ),
+              ],
             ),
             Expanded(
                 child: Align(
@@ -85,25 +87,25 @@ class OnboardingStepThirteen extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('changeSecretCode'),
+                          key: const Key('changeSecretCode'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
-                            primary: Color(0xffFFD58D),
+                            primary: const Color(0xffFFD58D),
                             onPrimary: Colors.black, // foreground
                           ),
                           onPressed: () async {
                             generatedWallet = await _generateWalletProvider
                                 .changePinCode(reload: false);
                           },
-                          child: Text("Choisir un autre code secret",
+                          child: const Text("Choisir un autre code secret",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 25),
+            const SizedBox(height: 25),
             SizedBox(
               width: 400,
               height: 62,
               child: ElevatedButton(
-                  key: Key('goStep12'),
+                  key: const Key('goStep12'),
                   style: ElevatedButton.styleFrom(
                     elevation: 5,
                     primary: orangeC,
@@ -120,10 +122,10 @@ class OnboardingStepThirteen extends StatelessWidget {
                           isFast: true),
                     );
                   },
-                  child: Text("J'ai noté mon code secret",
+                  child: const Text("J'ai noté mon code secret",
                       style: TextStyle(fontSize: 20))),
             ),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/12.dart b/lib/screens/onBoarding/12.dart
index ce6361f0..d715a478 100644
--- a/lib/screens/onBoarding/12.dart
+++ b/lib/screens/onBoarding/12.dart
@@ -1,13 +1,15 @@
+// ignore_for_file: file_names
+
 import 'dart:async';
 import 'dart:ui';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/generateWallets.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/models/walletOptions.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/models/generate_wallets.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/wallet_options.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/13_congratulations.dart';
 import 'package:pin_code_fields/pin_code_fields.dart';
 import 'package:provider/provider.dart';
@@ -22,7 +24,7 @@ class OnboardingStepFourteen extends StatelessWidget {
   NewWallet generatedWallet;
   final int progress = 11;
   final formKey = GlobalKey<FormState>();
-  var pinColor = Color(0xFFA4B600);
+  var pinColor = const Color(0xFFA4B600);
   bool hasError = false;
 
   @override
@@ -43,7 +45,7 @@ class OnboardingStepFourteen extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "Avez-vous bien mémorisé votre code secret ?\n\nVérifions ça ensemble !\n\nTapez votre code secret dans le champ ci-dessous (après c’est fini, promis-juré-gecko).",
-              textKey: Key('step12'),
+              textKey: const Key('step12'),
             ),
             SizedBox(height: isTall ? 80 : 10),
             pinForm(context, _walletOptions, _pinLenght, 1, 3)
@@ -70,7 +72,7 @@ class OnboardingStepFourteen extends StatelessWidget {
       child: Padding(
           padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 30),
           child: PinCodeTextField(
-            key: Key('formKey2'),
+            key: const Key('formKey2'),
             autoFocus: true,
             appContext: context,
             pastedTextStyle: TextStyle(
@@ -98,14 +100,14 @@ class OnboardingStepFourteen extends StatelessWidget {
               activeFillColor: hasError ? Colors.blueAccent : Colors.black,
             ),
             cursorColor: Colors.black,
-            animationDuration: Duration(milliseconds: 300),
-            textStyle: TextStyle(fontSize: 20, height: 1.6),
-            backgroundColor: Color(0xffF9F9F1),
+            animationDuration: const Duration(milliseconds: 300),
+            textStyle: const TextStyle(fontSize: 20, height: 1.6),
+            backgroundColor: const Color(0xffF9F9F1),
             enableActiveFill: false,
             errorAnimationController: errorController,
             controller: _enterPin,
             keyboardType: TextInputType.text,
-            boxShadows: [
+            boxShadows: const [
               BoxShadow(
                 offset: Offset(0, 1),
                 color: Colors.black12,
@@ -140,8 +142,8 @@ class OnboardingStepFourteen extends StatelessWidget {
               }
             },
             onChanged: (value) {
-              if (pinColor != Color(0xFFA4B600)) {
-                pinColor = Color(0xFFA4B600);
+              if (pinColor != const Color(0xFFA4B600)) {
+                pinColor = const Color(0xFFA4B600);
               }
             },
           )),
diff --git a/lib/screens/onBoarding/13_congratulations.dart b/lib/screens/onBoarding/13_congratulations.dart
index 58ad16a3..ac737432 100644
--- a/lib/screens/onBoarding/13_congratulations.dart
+++ b/lib/screens/onBoarding/13_congratulations.dart
@@ -1,13 +1,17 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 
 // ignore: must_be_immutable
 class OnboardingStepFiveteen extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 12;
 
+  OnboardingStepFiveteen({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -21,7 +25,7 @@ class OnboardingStepFiveteen extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "Top !\n\nVotre trousseau de clef et votre portefeuille ont été créés avec un immense succès.\n\nFélicitations !",
-              textKey: Key('step13'),
+              textKey: const Key('step13'),
             ),
             SizedBox(height: isTall ? 20 : 10),
             Image.asset(
@@ -35,7 +39,7 @@ class OnboardingStepFiveteen extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goWalletHome'),
+                          key: const Key('goWalletHome'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -51,10 +55,10 @@ class OnboardingStepFiveteen extends StatelessWidget {
                               '/mywallets',
                             );
                           },
-                          child: Text("Accéder à mes portefeuilles",
+                          child: const Text("Accéder à mes portefeuilles",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/2.dart b/lib/screens/onBoarding/2.dart
index 0d7a3f9e..19e2cbf0 100644
--- a/lib/screens/onBoarding/2.dart
+++ b/lib/screens/onBoarding/2.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/3.dart';
 // import 'package:gecko/screens/commonElements.dart';
 // import 'package:gecko/models/home.dart';
@@ -12,6 +14,8 @@ class OnboardingStepTwo extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 2;
 
+  OnboardingStepTwo({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -25,9 +29,9 @@ class OnboardingStepTwo extends StatelessWidget {
                 context, 'Nouveau portefeuilles', progress),
             common.bubbleSpeak(
               "Un trousseau est créé à partir d’une phrase de restauration.",
-              textKey: Key('step2'),
+              textKey: const Key('step2'),
             ),
-            SizedBox(height: 70),
+            const SizedBox(height: 70),
             Image.asset(
                 'assets/onBoarding/keys-and-wallets-horizontal-plus-phrase.png'),
             Expanded(
@@ -37,7 +41,7 @@ class OnboardingStepTwo extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                        key: Key('goStep3'),
+                        key: const Key('goStep3'),
                         style: ElevatedButton.styleFrom(
                           elevation: 5,
                           primary: orangeC,
@@ -50,10 +54,11 @@ class OnboardingStepTwo extends StatelessWidget {
                                 page: OnboardingStepFor(), isFast: true),
                           );
                         },
-                        child: Text("D'accord", style: TextStyle(fontSize: 20)),
+                        child: const Text("D'accord",
+                            style: TextStyle(fontSize: 20)),
                       ),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/3.dart b/lib/screens/onBoarding/3.dart
index 6d589ccf..815741b6 100644
--- a/lib/screens/onBoarding/3.dart
+++ b/lib/screens/onBoarding/3.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/4.dart';
 
 // ignore: must_be_immutable
@@ -9,6 +11,8 @@ class OnboardingStepFor extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 3;
 
+  OnboardingStepFor({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -22,7 +26,7 @@ class OnboardingStepFor extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "Si un jour vous changez de téléphone, il vous suffira de me redonner votre phrase de restauration pour recréer votre trousseau.",
-              textKey: Key('step3'),
+              textKey: const Key('step3'),
             ),
             SizedBox(height: isTall ? 15 : 0),
             // Row(children: <Widget>[
@@ -41,7 +45,7 @@ class OnboardingStepFor extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goStep4'),
+                          key: const Key('goStep4'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -54,10 +58,10 @@ class OnboardingStepFor extends StatelessWidget {
                                   page: OnboardingStepFive(), isFast: true),
                             );
                           },
-                          child: Text("J'ai compris",
+                          child: const Text("J'ai compris",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/4.dart b/lib/screens/onBoarding/4.dart
index 8d1feecf..bd0317bc 100644
--- a/lib/screens/onBoarding/4.dart
+++ b/lib/screens/onBoarding/4.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/5.dart';
 
 // ignore: must_be_immutable
@@ -9,6 +11,8 @@ class OnboardingStepFive extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 4;
 
+  OnboardingStepFive({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -22,7 +26,7 @@ class OnboardingStepFive extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "Par contre, attention :\n\nDans une blockchain, il n’y a pas de procédure de récupération de trousseau.\n\nSi vous perdez votre phrase de restauration, je ne pourrai pas vous la communiquer, et vous ne pourrez donc plus jamais accéder à votre compte.",
-              textKey: Key('step4'),
+              textKey: const Key('step4'),
             ),
             SizedBox(height: isTall ? 30 : 10),
             Image.asset(
@@ -36,7 +40,7 @@ class OnboardingStepFive extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goStep5'),
+                          key: const Key('goStep5'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -49,10 +53,10 @@ class OnboardingStepFive extends StatelessWidget {
                                   page: OnboardingStepSeven(), isFast: true),
                             );
                           },
-                          child: Text("J'ai compris",
+                          child: const Text("J'ai compris",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart
index 426770f6..dbe5ee75 100644
--- a/lib/screens/onBoarding/5.dart
+++ b/lib/screens/onBoarding/5.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/6.dart';
 
 // ignore: must_be_immutable
@@ -9,6 +11,8 @@ class OnboardingStepSeven extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 5;
 
+  OnboardingStepSeven({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -22,15 +26,15 @@ class OnboardingStepSeven extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeakRich(
               <TextSpan>[
-                TextSpan(text: "Munissez-vous d'"),
-                TextSpan(
+                const TextSpan(text: "Munissez-vous d'"),
+                const TextSpan(
                     text: 'un papier et d’un crayon\n',
                     style: TextStyle(fontWeight: FontWeight.bold)),
-                TextSpan(
+                const TextSpan(
                     text:
                         "afin de pouvoir noter votre phrase de restauration."),
               ],
-              textKey: Key('step5'),
+              textKey: const Key('step5'),
             ),
             Expanded(
                 child: Align(
@@ -53,7 +57,7 @@ class OnboardingStepSeven extends StatelessWidget {
               width: 400,
               height: 62,
               child: ElevatedButton(
-                  key: Key('goStep6'),
+                  key: const Key('goStep6'),
                   style: ElevatedButton.styleFrom(
                     elevation: 5,
                     primary: orangeC,
@@ -66,10 +70,10 @@ class OnboardingStepSeven extends StatelessWidget {
                           page: OnboardingStepEight(), isFast: true),
                     );
                   },
-                  child: Text("J'ai de quoi noter",
+                  child: const Text("J'ai de quoi noter",
                       style: TextStyle(fontSize: 20))),
             ),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart
index 54155cfa..741947d9 100644
--- a/lib/screens/onBoarding/6.dart
+++ b/lib/screens/onBoarding/6.dart
@@ -1,8 +1,10 @@
+// ignore_for_file: file_names
+
 import 'dart:ui';
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/7.dart';
 
 // ignore: must_be_immutable
@@ -10,6 +12,8 @@ class OnboardingStepEight extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 6;
 
+  OnboardingStepEight({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -23,7 +27,7 @@ class OnboardingStepEight extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "J’ai généré votre phrase de restauration !\nTâchez de la garder bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.",
-              textKey: Key('step6'),
+              textKey: const Key('step6'),
             ),
             SizedBox(height: isTall ? 61 : 31),
             // SizedBox(height: 30),
@@ -36,7 +40,7 @@ class OnboardingStepEight extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goStep7'),
+                          key: const Key('goStep7'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -49,10 +53,10 @@ class OnboardingStepEight extends StatelessWidget {
                                   page: OnboardingStepNine(), isFast: false),
                             );
                           },
-                          child: Text("Afficher ma phrase",
+                          child: const Text("Afficher ma phrase",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
@@ -60,16 +64,16 @@ class OnboardingStepEight extends StatelessWidget {
 
 Widget sentanceArray(BuildContext context) {
   return Container(
-      padding: EdgeInsets.symmetric(horizontal: 12),
+      padding: const EdgeInsets.symmetric(horizontal: 12),
       child: Container(
           decoration: BoxDecoration(
               border: Border.all(color: Colors.black),
               color: Colors.grey[300],
-              borderRadius: BorderRadius.all(
-                const Radius.circular(10),
+              borderRadius: const BorderRadius.all(
+                Radius.circular(10),
               )),
           // color: Colors.grey[300],
-          padding: EdgeInsets.all(20),
+          padding: const EdgeInsets.all(20),
           child: Column(
               mainAxisAlignment: MainAxisAlignment.center,
               mainAxisSize: MainAxisSize.max,
@@ -81,14 +85,14 @@ Widget sentanceArray(BuildContext context) {
                   arrayCell("3:curseur"),
                   arrayCell("4:relatif"),
                 ]),
-                SizedBox(height: 15),
+                const SizedBox(height: 15),
                 Row(children: <Widget>[
                   arrayCell("5:embellir"),
                   arrayCell("6:cultiver"),
                   arrayCell("7:bureau"),
                   arrayCell("8:ossature"),
                 ]),
-                SizedBox(height: 15),
+                const SizedBox(height: 15),
                 Row(children: <Widget>[
                   arrayCell("9:labial"),
                   arrayCell("10:science"),
@@ -99,20 +103,20 @@ Widget sentanceArray(BuildContext context) {
 }
 
 Widget arrayCell(dataWord) {
-  return Container(
+  return SizedBox(
       width: 102,
       child: Column(
         children: <Widget>[
           ImageFiltered(
             imageFilter: ImageFilter.blur(sigmaX: 1, sigmaY: 1),
             child: Text(dataWord.split(':')[0],
-                style: TextStyle(fontSize: 14, color: Colors.black)),
+                style: const TextStyle(fontSize: 14, color: Colors.black)),
           ),
-          SizedBox(height: 2),
+          const SizedBox(height: 2),
           ImageFiltered(
             imageFilter: ImageFilter.blur(sigmaX: 4, sigmaY: 4),
             child: Text(dataWord.split(':')[1],
-                style: TextStyle(fontSize: 20, color: Colors.black)),
+                style: const TextStyle(fontSize: 20, color: Colors.black)),
           )
         ],
       ));
diff --git a/lib/screens/onBoarding/7.dart b/lib/screens/onBoarding/7.dart
index 7d5fc06a..be94bc45 100644
--- a/lib/screens/onBoarding/7.dart
+++ b/lib/screens/onBoarding/7.dart
@@ -1,8 +1,10 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/generateWallets.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/models/generate_wallets.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/8.dart';
 import 'package:printing/printing.dart';
 import 'package:provider/provider.dart';
@@ -12,6 +14,8 @@ class OnboardingStepNine extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 6;
 
+  OnboardingStepNine({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -29,7 +33,7 @@ class OnboardingStepNine extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeak(
               "C'est le moment de noter votre phrase !",
-              textKey: Key('step7'),
+              textKey: const Key('step7'),
               long: 60,
             ),
             SizedBox(height: isTall ? 100 : 70),
@@ -56,24 +60,24 @@ class OnboardingStepNine extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('generateMnemonic'),
+                          key: const Key('generateMnemonic'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
-                            primary: Color(0xffFFD58D),
+                            primary: const Color(0xffFFD58D),
                             onPrimary: Colors.black, // foreground
                           ),
                           onPressed: () {
                             _generateWalletProvider.reloadBuild();
                           },
-                          child: Text("Choisir une autre phrase",
+                          child: const Text("Choisir une autre phrase",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 25),
+            const SizedBox(height: 25),
             SizedBox(
               width: 400,
               height: 62,
               child: ElevatedButton(
-                  key: Key('goStep8'),
+                  key: const Key('goStep8'),
                   style: ElevatedButton.styleFrom(
                     elevation: 5,
                     primary: orangeC,
@@ -97,10 +101,10 @@ class OnboardingStepNine extends StatelessWidget {
                           isFast: true),
                     );
                   },
-                  child: Text("J'ai noté ma phrase",
+                  child: const Text("J'ai noté ma phrase",
                       style: TextStyle(fontSize: 20))),
             ),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
@@ -112,7 +116,7 @@ Widget sentanceArray(BuildContext context) {
 
   return FutureBuilder(
       future: _generateWalletProvider.generateWordList(),
-      initialData: [
+      initialData: const [
         '1:...',
         '2:...',
         '3:...',
@@ -129,16 +133,16 @@ Widget sentanceArray(BuildContext context) {
       builder: (context, formatedArray) {
         // print(formatedArray.data);
         return Container(
-            padding: EdgeInsets.symmetric(horizontal: 12),
+            padding: const EdgeInsets.symmetric(horizontal: 12),
             child: Container(
                 decoration: BoxDecoration(
                     border: Border.all(color: Colors.black),
                     color: Colors.grey[300],
-                    borderRadius: BorderRadius.all(
-                      const Radius.circular(10),
+                    borderRadius: const BorderRadius.all(
+                      Radius.circular(10),
                     )),
                 // color: Colors.grey[300],
-                padding: EdgeInsets.all(20),
+                padding: const EdgeInsets.all(20),
                 child: Column(
                     mainAxisAlignment: MainAxisAlignment.center,
                     mainAxisSize: MainAxisSize.max,
@@ -150,14 +154,14 @@ Widget sentanceArray(BuildContext context) {
                         arrayCell(formatedArray.data[2]),
                         arrayCell(formatedArray.data[3]),
                       ]),
-                      SizedBox(height: 15),
+                      const SizedBox(height: 15),
                       Row(children: <Widget>[
                         arrayCell(formatedArray.data[4]),
                         arrayCell(formatedArray.data[5]),
                         arrayCell(formatedArray.data[6]),
                         arrayCell(formatedArray.data[7]),
                       ]),
-                      SizedBox(height: 15),
+                      const SizedBox(height: 15),
                       Row(children: <Widget>[
                         arrayCell(formatedArray.data[8]),
                         arrayCell(formatedArray.data[9]),
@@ -169,20 +173,20 @@ Widget sentanceArray(BuildContext context) {
 }
 
 Widget arrayCell(dataWord) {
-  return Container(
+  return SizedBox(
       width: 102,
       child: Column(children: <Widget>[
-        Text(dataWord.split(':')[0], style: TextStyle(fontSize: 14)),
-        SizedBox(height: 2),
+        Text(dataWord.split(':')[0], style: const TextStyle(fontSize: 14)),
+        const SizedBox(height: 2),
         Text(dataWord.split(':')[1],
             key: Key('word${dataWord.split(':')[0]}'),
-            style: TextStyle(fontSize: 19, color: Colors.black)),
+            style: const TextStyle(fontSize: 19, color: Colors.black)),
       ]));
 }
 
 // ignore: must_be_immutable
 class PrintWallet extends StatelessWidget {
-  PrintWallet(this.sentence);
+  const PrintWallet(this.sentence, {Key key}) : super(key: key);
 
   final String sentence;
 
@@ -192,7 +196,7 @@ class PrintWallet extends StatelessWidget {
         Provider.of<GenerateWalletsProvider>(context);
     return MaterialApp(
       home: Scaffold(
-        appBar: AppBar(title: Text('Imprimer ce trousseau')),
+        appBar: AppBar(title: const Text('Imprimer ce trousseau')),
         body: PdfPreview(
           build: (format) => _generateWalletProvider.printWallet(sentence),
         ),
diff --git a/lib/screens/onBoarding/8.dart b/lib/screens/onBoarding/8.dart
index 3a16dde6..9afcda8d 100644
--- a/lib/screens/onBoarding/8.dart
+++ b/lib/screens/onBoarding/8.dart
@@ -1,10 +1,12 @@
+// ignore_for_file: file_names
+
 import 'dart:ui';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/generateWallets.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/models/generate_wallets.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/9.dart';
 import 'package:provider/provider.dart';
 
@@ -21,7 +23,7 @@ class OnboardingStepTen extends StatelessWidget {
 
   TextEditingController tplController = TextEditingController();
   TextEditingController wordController = TextEditingController();
-  TextEditingController _mnemonicController = TextEditingController();
+  final TextEditingController _mnemonicController = TextEditingController();
 
   final int progress = 7;
 
@@ -31,7 +33,7 @@ class OnboardingStepTen extends StatelessWidget {
     GenerateWalletsProvider _generateWalletProvider =
         Provider.of<GenerateWalletsProvider>(context);
     CommonElements common = CommonElements();
-    this._mnemonicController.text = generatedMnemonic;
+    _mnemonicController.text = generatedMnemonic;
 
     return WillPopScope(
         onWillPop: () {
@@ -60,11 +62,11 @@ class OnboardingStepTen extends StatelessWidget {
                         text: " de votre phrase de restauration :",
                         style: TextStyle(fontSize: 16 * ratio)),
                   ],
-                  textKey: Key('step8'),
+                  textKey: const Key('step8'),
                 ),
                 SizedBox(height: isTall ? 70 : 10),
                 Text('${_generateWalletProvider.nbrWord + 1}',
-                    key: Key('askedWord'),
+                    key: const Key('askedWord'),
                     style: TextStyle(
                         fontSize: isTall ? 17 : 10,
                         color: orangeC,
@@ -79,10 +81,10 @@ class OnboardingStepTen extends StatelessWidget {
                         )),
                     width: 430,
                     child: TextFormField(
-                        key: Key('inputWord'),
+                        key: const Key('inputWord'),
                         autofocus: true,
                         enabled: !_generateWalletProvider.isAskedWordValid,
-                        controller: this.wordController,
+                        controller: wordController,
                         textInputAction: TextInputAction.next,
                         onChanged: (value) {
                           _generateWalletProvider.checkAskedWord(
@@ -100,7 +102,7 @@ class OnboardingStepTen extends StatelessWidget {
                               : "${_generateWalletProvider.nbrWordAlpha} mot de votre phrase de restauration",
                           fillColor: Colors.grey[300],
                           filled: true,
-                          contentPadding: EdgeInsets.all(12),
+                          contentPadding: const EdgeInsets.all(12),
                         ),
                         style: TextStyle(
                             fontSize: 40.0,
@@ -115,7 +117,7 @@ class OnboardingStepTen extends StatelessWidget {
                               width: 400,
                               height: 62,
                               child: ElevatedButton(
-                                  key: Key('goStep9'),
+                                  key: const Key('goStep9'),
                                   style: ElevatedButton.styleFrom(
                                     elevation: 5,
                                     primary: orangeC,
@@ -129,10 +131,10 @@ class OnboardingStepTen extends StatelessWidget {
                                           isFast: true),
                                     );
                                   },
-                                  child: Text("Continuer",
+                                  child: const Text("Continuer",
                                       style: TextStyle(fontSize: 20))),
                             )))),
-                SizedBox(height: 80),
+                const SizedBox(height: 80),
               ]),
             )));
   }
diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart
index 67b9cc5a..35b285ee 100644
--- a/lib/screens/onBoarding/9.dart
+++ b/lib/screens/onBoarding/9.dart
@@ -1,7 +1,9 @@
+// ignore_for_file: file_names
+
 import 'package:flutter/services.dart';
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/screens/commonElements.dart';
+import 'package:gecko/screens/common_elements.dart';
 import 'package:gecko/screens/onBoarding/10.dart';
 
 // ignore: must_be_immutable
@@ -9,6 +11,8 @@ class OnboardingStepEleven extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
   final int progress = 8;
 
+  OnboardingStepEleven({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -22,15 +26,16 @@ class OnboardingStepEleven extends StatelessWidget {
                 context, 'Ma phrase de restauration', progress),
             common.bubbleSpeakRich(
               <TextSpan>[
-                TextSpan(text: "Super !\n\nJe vais maintenant créer votre "),
-                TextSpan(
+                const TextSpan(
+                    text: "Super !\n\nJe vais maintenant créer votre "),
+                const TextSpan(
                     text: 'code secret.',
                     style: TextStyle(fontWeight: FontWeight.bold)),
-                TextSpan(
+                const TextSpan(
                     text:
                         " \n\nVotre code secret chiffre votre trousseau de clefs, ce qui le rend inutilisable par d’autres, par exemple si vous perdez votre téléphone ou si on vous le vole."),
               ],
-              textKey: Key('step9'),
+              textKey: const Key('step9'),
             ),
             SizedBox(height: isTall ? 50 : 10),
             Image.asset(
@@ -44,7 +49,7 @@ class OnboardingStepEleven extends StatelessWidget {
                       width: 400,
                       height: 62,
                       child: ElevatedButton(
-                          key: Key('goStep10'),
+                          key: const Key('goStep10'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: orangeC,
@@ -57,10 +62,10 @@ class OnboardingStepEleven extends StatelessWidget {
                                   page: OnboardingStepTwelve(), isFast: true),
                             );
                           },
-                          child: Text("J'ai compris",
+                          child: const Text("J'ai compris",
                               style: TextStyle(fontSize: 20))),
                     ))),
-            SizedBox(height: 80),
+            const SizedBox(height: 80),
           ]),
         ));
   }
diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart
index 366cfdb5..462c76c8 100644
--- a/lib/screens/settings.dart
+++ b/lib/screens/settings.dart
@@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
 import 'package:dubp/dubp.dart';
 import 'package:flutter/services.dart';
 import 'package:gecko/models/home.dart';
-import 'package:gecko/models/myWallets.dart';
-import 'package:gecko/screens/myWallets/generateWallets.dart';
+import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/screens/myWallets/generate_wallets.dart';
 import 'dart:io';
-import 'package:gecko/screens/myWallets/importWallet.dart';
+import 'package:gecko/screens/myWallets/import_wallet.dart';
 import 'package:gecko/globals.dart';
 import 'package:provider/provider.dart';
 
@@ -22,7 +22,9 @@ class SettingsScreen extends StatelessWidget {
   var pinColor = Colors.grey[300];
   Directory appPath;
 
-  MyWalletsProvider _myWallets = MyWalletsProvider();
+  final MyWalletsProvider _myWallets = MyWalletsProvider();
+
+  SettingsScreen({Key key}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -32,12 +34,12 @@ class SettingsScreen extends StatelessWidget {
     // getAppDirectory();
     return Scaffold(
         appBar: AppBar(
-            title: SizedBox(
+            title: const SizedBox(
           height: 22,
           child: Text('Paramètres'),
         )),
         body: Column(children: <Widget>[
-          SizedBox(height: 40),
+          const SizedBox(height: 40),
           SizedBox(
               height: 70,
               width: 500,
@@ -50,19 +52,19 @@ class SettingsScreen extends StatelessWidget {
                   onPressed: () => Navigator.push(
                         context,
                         MaterialPageRoute(builder: (context) {
-                          return ImportWalletScreen();
+                          return const ImportWalletScreen();
                         }),
                       ).then((value) => {
                             if (value == true) {Navigator.pop(context)}
                           }),
-                  child: Text("Importer un portefeuille Cesium",
+                  child: const Text("Importer un portefeuille Cesium",
                       style: TextStyle(fontSize: 16)))),
-          SizedBox(height: 30),
+          const SizedBox(height: 30),
           SizedBox(
               height: 70,
               width: 500,
               child: ElevatedButton(
-                  key: Key('generateKeychain'),
+                  key: const Key('generateKeychain'),
                   style: ElevatedButton.styleFrom(
                     elevation: 5,
                     primary: yellowC, // background
@@ -76,7 +78,7 @@ class SettingsScreen extends StatelessWidget {
                       ).then((value) => {
                             if (value == true) {Navigator.pop(context)}
                           }),
-                  child: Text("Générer un nouveau trousseau",
+                  child: const Text("Générer un nouveau trousseau",
                       style: TextStyle(fontSize: 16)))),
           Expanded(
               child: Align(
@@ -85,7 +87,7 @@ class SettingsScreen extends StatelessWidget {
                       height: 100,
                       width: 500,
                       child: ElevatedButton(
-                          key: Key('deleteAllWallets'),
+                          key: const Key('deleteAllWallets'),
                           style: ElevatedButton.styleFrom(
                             elevation: 5,
                             primary: Colors.redAccent, // background
@@ -97,9 +99,9 @@ class SettingsScreen extends StatelessWidget {
                                     .deleteAllWallet(context)
                                     .then((v) => _homeProvider.rebuildWidget())
                               },
-                          child: Text("EFFACER TOUS MES PORTEFEUILLES",
+                          child: const Text("EFFACER TOUS MES PORTEFEUILLES",
                               style: TextStyle(fontSize: 20)))))),
-          SizedBox(height: 50),
+          const SizedBox(height: 50),
         ]));
   }
 }
diff --git a/lib/screens/templateScreen.dart b/lib/screens/template_screen.dart
similarity index 79%
rename from lib/screens/templateScreen.dart
rename to lib/screens/template_screen.dart
index cf6dfd6a..10b9cf46 100644
--- a/lib/screens/templateScreen.dart
+++ b/lib/screens/template_screen.dart
@@ -9,17 +9,19 @@ import 'package:flutter/material.dart';
 class TemplateScreen extends StatelessWidget {
   TextEditingController tplController = TextEditingController();
 
+  TemplateScreen({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
     // HomeProvider _homeProvider = Provider.of<HomeProvider>(context);
     return Scaffold(
         appBar: AppBar(
-            title: SizedBox(
+            title: const SizedBox(
           height: 22,
           child: Text('Template screen'),
         )),
-        floatingActionButton: Container(
+        floatingActionButton: SizedBox(
             height: 80.0,
             width: 80.0,
             child: FittedBox(
@@ -28,10 +30,10 @@ class TemplateScreen extends StatelessWidget {
               onPressed: () => Navigator.push(
                 context,
                 MaterialPageRoute(builder: (context) {
-                  return HomeScreen();
+                  return const HomeScreen();
                 }),
               ),
-              child: Container(
+              child: SizedBox(
                 height: 40.0,
                 width: 40.0,
                 child: Icon(Icons.home, color: Colors.grey[850]),
@@ -41,20 +43,20 @@ class TemplateScreen extends StatelessWidget {
             ))),
         body: SafeArea(
           child: Column(children: <Widget>[
-            SizedBox(height: 20),
+            const SizedBox(height: 20),
             TextField(
                 enabled: true,
                 controller: tplController,
                 maxLines: 1,
                 textAlign: TextAlign.center,
-                decoration: InputDecoration(
+                decoration: const InputDecoration(
                   contentPadding: EdgeInsets.all(15.0),
                 ),
-                style: TextStyle(
+                style: const TextStyle(
                     fontSize: 22.0,
                     color: Colors.black,
                     fontWeight: FontWeight.w400)),
-            SizedBox(height: 20),
+            const SizedBox(height: 20),
             ElevatedButton(
                 style: ElevatedButton.styleFrom(
                   primary: yellowC, // background
@@ -64,12 +66,13 @@ class TemplateScreen extends StatelessWidget {
                   Navigator.push(
                     context,
                     MaterialPageRoute(builder: (context) {
-                      return HomeScreen();
+                      return const HomeScreen();
                     }),
                   );
                 },
-                child: Text('Retour Accueil', style: TextStyle(fontSize: 20))),
-            SizedBox(height: 20),
+                child: const Text('Retour Accueil',
+                    style: TextStyle(fontSize: 20))),
+            const SizedBox(height: 20),
             GestureDetector(
                 onTap: () {
                   Navigator.popUntil(
@@ -77,7 +80,7 @@ class TemplateScreen extends StatelessWidget {
                     ModalRoute.withName('/'),
                   );
                 },
-                child: Icon(Icons.home))
+                child: const Icon(Icons.home))
           ]),
         ));
   }
diff --git a/macos/.gitignore b/macos/.gitignore
new file mode 100644
index 00000000..746adbb6
--- /dev/null
+++ b/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 00000000..c2efd0b6
--- /dev/null
+++ b/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 00000000..c2efd0b6
--- /dev/null
+++ b/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 00000000..fc41ebee
--- /dev/null
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,24 @@
+//
+//  Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import connectivity_plus_macos
+import package_info
+import package_info_plus_macos
+import path_provider_macos
+import printing
+import sentry_flutter
+import shared_preferences_macos
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+  ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
+  FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))
+  FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
+  PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+  PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin"))
+  SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin"))
+  SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
+}
diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..bfee57ab
--- /dev/null
+++ b/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,572 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 51;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+			buildPhases = (
+				33CC111E2044C6BF0003C045 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "Flutter Assemble";
+			productName = FLX;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+		33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+		33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+		33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+		33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+			remoteInfo = FLX;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		33CC110E2044A8840003C045 /* Bundle Framework */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+			);
+			name = "Bundle Framework";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
+		335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
+		33CC10ED2044A3C60003C045 /* gecko.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "gecko.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+		33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
+		33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
+		33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
+		33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
+		33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
+		33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
+		33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
+		33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
+		33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
+		33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		33CC10EA2044A3C60003C045 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		33BA886A226E78AF003329D5 /* Configs */ = {
+			isa = PBXGroup;
+			children = (
+				33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+			);
+			path = Configs;
+			sourceTree = "<group>";
+		};
+		33CC10E42044A3C60003C045 = {
+			isa = PBXGroup;
+			children = (
+				33FAB671232836740065AC1E /* Runner */,
+				33CEB47122A05771004F2AC0 /* Flutter */,
+				33CC10EE2044A3C60003C045 /* Products */,
+				D73912EC22F37F3D000D13A0 /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		33CC10EE2044A3C60003C045 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10ED2044A3C60003C045 /* gecko.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		33CC11242044D66E0003C045 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F22044A3C60003C045 /* Assets.xcassets */,
+				33CC10F42044A3C60003C045 /* MainMenu.xib */,
+				33CC10F72044A3C60003C045 /* Info.plist */,
+			);
+			name = Resources;
+			path = ..;
+			sourceTree = "<group>";
+		};
+		33CEB47122A05771004F2AC0 /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+				33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+				33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+				33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+			);
+			path = Flutter;
+			sourceTree = "<group>";
+		};
+		33FAB671232836740065AC1E /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+				33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+				33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+				33E51914231749380026EE4D /* Release.entitlements */,
+				33CC11242044D66E0003C045 /* Resources */,
+				33BA886A226E78AF003329D5 /* Configs */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+		D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		33CC10EC2044A3C60003C045 /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				33CC10E92044A3C60003C045 /* Sources */,
+				33CC10EA2044A3C60003C045 /* Frameworks */,
+				33CC10EB2044A3C60003C045 /* Resources */,
+				33CC110E2044A8840003C045 /* Bundle Framework */,
+				3399D490228B24CF009A79C7 /* ShellScript */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				33CC11202044C79F0003C045 /* PBXTargetDependency */,
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 33CC10ED2044A3C60003C045 /* gecko.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		33CC10E52044A3C60003C045 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastSwiftUpdateCheck = 0920;
+				LastUpgradeCheck = 0930;
+				ORGANIZATIONNAME = "";
+				TargetAttributes = {
+					33CC10EC2044A3C60003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						LastSwiftMigration = 1100;
+						ProvisioningStyle = Automatic;
+						SystemCapabilities = {
+							com.apple.Sandbox = {
+								enabled = 1;
+							};
+						};
+					};
+					33CC111A2044C6BA0003C045 = {
+						CreatedOnToolsVersion = 9.2;
+						ProvisioningStyle = Manual;
+					};
+				};
+			};
+			buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 33CC10E42044A3C60003C045;
+			productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				33CC10EC2044A3C60003C045 /* Runner */,
+				33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		33CC10EB2044A3C60003C045 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+				33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3399D490228B24CF009A79C7 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+		};
+		33CC111E2044C6BF0003C045 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				Flutter/ephemeral/FlutterInputs.xcfilelist,
+			);
+			inputPaths = (
+				Flutter/ephemeral/tripwire,
+			);
+			outputFileListPaths = (
+				Flutter/ephemeral/FlutterOutputs.xcfilelist,
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		33CC10E92044A3C60003C045 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+				33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+				335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+			targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+			isa = PBXVariantGroup;
+			children = (
+				33CC10F52044A3C60003C045 /* Base */,
+			);
+			name = MainMenu.xib;
+			path = Runner;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		338D0CE9231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Profile;
+		};
+		338D0CEA231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Profile;
+		};
+		338D0CEB231458BD00FA5F75 /* Profile */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Profile;
+		};
+		33CC10F92044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		33CC10FA2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Release;
+		};
+		33CC10FC2044A3C60003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Debug;
+		};
+		33CC10FD2044A3C60003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				INFOPLIST_FILE = Runner/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Release;
+		};
+		33CC111C2044C6BA0003C045 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Manual;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		33CC111D2044C6BA0003C045 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10F92044A3C60003C045 /* Debug */,
+				33CC10FA2044A3C60003C045 /* Release */,
+				338D0CE9231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC10FC2044A3C60003C045 /* Debug */,
+				33CC10FD2044A3C60003C045 /* Release */,
+				338D0CEA231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				33CC111C2044C6BA0003C045 /* Debug */,
+				33CC111D2044C6BA0003C045 /* Release */,
+				338D0CEB231458BD00FA5F75 /* Profile */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..1e2f67bc
--- /dev/null
+++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1000"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+               BuildableName = "gecko.app"
+               BlueprintName = "Runner"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "gecko.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "gecko.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Profile"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
+            BuildableName = "gecko.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift
new file mode 100644
index 00000000..d53ef643
--- /dev/null
+++ b/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+    return true
+  }
+}
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..a2ec33f1
--- /dev/null
+++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+  "images" : [
+    {
+      "size" : "16x16",
+      "idiom" : "mac",
+      "filename" : "app_icon_16.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "16x16",
+      "idiom" : "mac",
+      "filename" : "app_icon_32.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "32x32",
+      "idiom" : "mac",
+      "filename" : "app_icon_32.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "32x32",
+      "idiom" : "mac",
+      "filename" : "app_icon_64.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "128x128",
+      "idiom" : "mac",
+      "filename" : "app_icon_128.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "128x128",
+      "idiom" : "mac",
+      "filename" : "app_icon_256.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "256x256",
+      "idiom" : "mac",
+      "filename" : "app_icon_256.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "256x256",
+      "idiom" : "mac",
+      "filename" : "app_icon_512.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "512x512",
+      "idiom" : "mac",
+      "filename" : "app_icon_512.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "512x512",
+      "idiom" : "mac",
+      "filename" : "app_icon_1024.png",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea
GIT binary patch
literal 46993
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

literal 0
HcmV?d00001

diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc
GIT binary patch
literal 3276
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
U!qXQS7#J8lUHx3vIVCg!026`!g8%>k

literal 0
HcmV?d00001

diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..483be61389733f2e5331c08db8ca245268610ccb
GIT binary patch
literal 1429
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU<L*TmUKs7M+SzC{oH>NSs54@
z6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dcykO3*KpO@IrilSQA+8Jz
z3<)QHB%J&a4@Pk(e#C-N^obwQ$Dt_k<j=&DKQYzBocIA!cH&3W@gHzCaMR#M#hmy7
zRS8pu%QT3xgp*Ly;AWz^Ef#EGJlNTA#mLT!JMkm##E-<2AcsXB{{cY|hrvm>nGknI
zo%j)T>_^0LgcgVbWD;U5#CDL!krYQBhXx=-JwzqMF1YujU@i$g{wwl0$b}GPkN{6S
z`9po{SNnb6!;gVO71eNv`Ed2|Cx7T}|7N`No6*j1c6+~vfwcULMA8B=GxGQkhO&1?
zU}c6ozZvfOZn62D^O{Enlh0Ou`X7E2q}^cWH;@!qR%gvC;o`0AQFGWpXfA8iT$ac=
zQ0+Uu8Seh6z3QcC!Dfz#+3Zns*`lBdm?P#eMa(wb`ORSGH=(=@LirovvJexPBjzwi
z%wY_lt-s@&`nuPmr8^*c;j&B-vl%01Geyk)|Np;2#5@xQ28LTDL4KeF&ft9i+t(ip
z_!t-%7_6@S|NnoR9EizaedGWC|664+*eDXH90n*?8mx(tfx+Y^$P6iwrkOKlSMW11
znBM&Vf2)-6%K!iWKk))7vc9nm!o3g5CkzY>I#Qw_*?UkfL*M`Z|9`}Qlrq?X9JC4I
zAc#d<U>uOMw?drla{v1`kZ&x447eE>7#Neh-Cb_IV^(WoU|`@Z@Q5sCVBi)8VMc~o
zb0ioT7}!fZeO=ifbFy+6aSK)V_AxLpvU$2VhDcmaPGDekQ%e&IGb`is)5|lM-#)!R
z-XXvv!X?B<=E(F3QzlKDICXM(KuAy+<HyjeS4>T|ZYeGK`h~Zl##uR8IM}$D+gm$Z
zI$GiWxqAmMp1gVV>e;)8FQ2}BeEPxj_6i0X7Aht>HcCcXR%+7}_3RW4H7!+5b#0Z6
zwXM~sE9&oGuwliHC0o|)S+r@@u4U5}uG_b8<I0^&x31m0c=PJr%cn0~Uw`O`=j7!+
zbIodxor&E1oMG)u>->LBt=(e!k-Kt!c1=xaH(nF9H|_1NuhM3DxAvrJM<m?-CTm^(
z_TJ|5`~R5P`5RsN<Snb-{OFv#+;6^RHQ%C_e_Fez>&5S^di$$)Hp5cCn7SJ(<$oC%
z7*tDKBT7;dOH!?pi&7IyQW=a43@vpHEOiY`Lkvx=Obx6I4RsC7tqcqn=oIIoXvob^
Z$xN%nt>I$f>5HKF^>p=fS?83{1OQU9x^Vyi

literal 0
HcmV?d00001

diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d
GIT binary patch
literal 5933
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
I&MBb@0FMIvLjV8(

literal 0
HcmV?d00001

diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c0a652864769b250ed58097f2f6270b393f751f
GIT binary patch
literal 1243
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmSN`?>!lvVtU&
zJ%W507^>757#dm_7=AG@Ff_biU???UV0e|lz+g3lfkC`r&aOZk1_lPUByV>YhW{YA
zVDIwD3=9mM1s;*b3=G`DAk4@xYmNj10|R@Br>`sfV@_5MBW|JU-aZBf=2M<7jv*0;
z*G`YkkO>tzUY}kj{h9HYNQ;>Kk#C+Ylio~jQh0K7-_I;o-{#p398Cf>pVoG)Sg2on
zhV96;W&NS?CM^oB)6_bqEK*gywWTxUx1y=M^<Cex=RXRb`@K8!?#;Qp>cp8dtDn!i
z|9?*L`<>QK({poHa;>P9VLG>>C`NI^+*ff^WeS`VnIbIzN9i;C%zL0debo!QKamfL
zAFw=F>L>JW!5pE8!rhnEw=^^>{r<4N;iTENYYj?=YKj&pGd}*fA^HbPgzd@?o(Tv2
z{+jXByEE~~9NA#iKKrDhMM?~_*u9m{A028eUjNN(&lNMK$cL*oW=?#*ZMWo}wGDZ;
z$3MnI9f;=gXx7$xpyO)Jb#e}Kdh~%{))FrM!}ksExV>0;=xv3Vg~Pd8i<fVT9gSN5
zdOq05(W4tWQOtE&=DDqgZ|;{c^t1FFwdp?`yr=IVYcbPNzWE=PE!58`{&-kJN-pHb
zB(rGUmz8(-{1Gaca>d8>+dAg&xyz$De>dto9nMVfSW{*?tz9&&A^BqA9gV}xdQ9>=
z=bj9@b0vHEsiO}L+SQ0@n4Ia3-_LHx_D(hQ<}>E`4632bTlcH%Io`}0f6`NCooA8E
zKgI%cO(QYJP_xFBA2z;_h+tM@70co>|IZyDaqm`gnS#FW!@f4QA9IS8tZr`*s$6Zr
z;nS{^mn`<wDfZ#BFa`sjGv6vi_`Y)ft<2=QZuX&V&i?YPkEAN}d`_M}P$R@AB4Y92
z;6uAa1$EiO(ku*nq`L}^ZC$rvlc<7X%v{#x4*l%y)vb+tG*crV`m(CHPRTCVEz{6A
ztzn`|pJG?bafdj)Rj=A3AFO1$6ZYfe_U-eTmIrAoJAHk>d+MiGuYMeKJ|DlM>{oVG
zyncYC^}S1VYK(~+CAn6oY?Q1?|EvEm@?Wd%{r|x(YK=z~42sIn@1LJ#e|dh8p<;c@
z%|%N&*09Cx+kEh^_US8Sr#Om2LeoP^L!7?z?J>T+w;}%ioAS?lIek{nN^0f!cgu=j
zKX&Q9y~13f4a%#|tT4(_f95}B)~)>6Ot;+*ZB4M-oFY)NYtOd0nu5xickgmJ-g9=I
zKDVlfJJ?yw^v#;HM~!DhG938O?{?(gH$EwrX6et}mv{I7RpKmA5ec{&eV|3FyKGHe
zV!VrcyxaA@@3;AV<<|b&_%c7&Pcf+IJWuao#=Zo<Q-Qy2U+%RPzIi6K^>*3&JLx(0
zpN;zEZCv)mi0)vKVR5_Cxq`Q{LXznoLtetArhng@%b6ImuJ2c_f1~?5B6J7S9*#W=
zR;8Xf`D*nn?FZVo*!L_tmHHsQ&YbBVyNu$awNG26Ef^RWR7+eVN>UO_QmvAUQWHy3
z8H@}JEp-hnbq!2I3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Giwq1544$rj
JF6*2UngAMu6(#@x

literal 0
HcmV?d00001

diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4
GIT binary patch
literal 14800
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
U3r}BUU|?YIboFyt=akR{00MO-p8x;=

literal 0
HcmV?d00001

diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a31fe2dd3f91d79cab6e0390356bb3c1a355f94
GIT binary patch
literal 1874
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
ALI3~&

literal 0
HcmV?d00001

diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 00000000..537341ab
--- /dev/null
+++ b/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
+            <connections>
+                <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target">
+            <connections>
+                <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
+                <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
+        <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
+            <items>
+                <menuItem title="APP_NAME" id="1Xt-HY-uBw">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
+                        <items>
+                            <menuItem title="About APP_NAME" id="5kV-Vb-QxS">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
+                            <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
+                            <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
+                            <menuItem title="Services" id="NMo-om-nkz">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
+                            <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
+                                <connections>
+                                    <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Show All" id="Kd2-mp-pUS">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
+                            <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
+                                <connections>
+                                    <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Edit" id="5QF-Oa-p0T">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Edit" id="W48-6f-4Dl">
+                        <items>
+                            <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
+                                <connections>
+                                    <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
+                                <connections>
+                                    <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
+                            <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
+                                <connections>
+                                    <action selector="cut:" target="-1" id="YJe-68-I9s"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
+                                <connections>
+                                    <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
+                                <connections>
+                                    <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Delete" id="pa3-QI-u2k">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
+                                <connections>
+                                    <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
+                            <menuItem title="Find" id="4EN-yA-p0u">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Find" id="1b7-l0-nxx">
+                                    <items>
+                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
+                                            <connections>
+                                                <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
+                                            <connections>
+                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
+                                    <items>
+                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
+                                            <connections>
+                                                <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
+                                            <connections>
+                                                <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
+                                        <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Substitutions" id="9ic-FL-obx">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
+                                    <items>
+                                        <menuItem title="Show Substitutions" id="z6F-FW-3nz">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
+                                        <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Quotes" id="hQb-2v-fYv">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Dashes" id="rgM-f4-ycn">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Smart Links" id="cwL-P1-jid">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Data Detectors" id="tRr-pd-1PS">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Text Replacement" id="HFQ-gK-NFA">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Transformations" id="2oI-Rn-ZJC">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
+                                    <items>
+                                        <menuItem title="Make Upper Case" id="vmV-6d-7jI">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Make Lower Case" id="d9M-CD-aMd">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Capitalize" id="UEZ-Bs-lqG">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                            <menuItem title="Speech" id="xrE-MZ-jX0">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
+                                    <items>
+                                        <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
+                                            </connections>
+                                        </menuItem>
+                                        <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
+                                            <modifierMask key="keyEquivalentModifierMask"/>
+                                            <connections>
+                                                <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
+                                            </connections>
+                                        </menuItem>
+                                    </items>
+                                </menu>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="View" id="H8h-7b-M4v">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="View" id="HyV-fh-RgO">
+                        <items>
+                            <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
+                                <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
+                                <connections>
+                                    <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+                <menuItem title="Window" id="aUF-d1-5bR">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
+                        <items>
+                            <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
+                                <connections>
+                                    <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem title="Zoom" id="R4o-n2-Eq4">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
+                                </connections>
+                            </menuItem>
+                            <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
+                            <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
+                                <modifierMask key="keyEquivalentModifierMask"/>
+                                <connections>
+                                    <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
+                                </connections>
+                            </menuItem>
+                        </items>
+                    </menu>
+                </menuItem>
+            </items>
+            <point key="canvasLocation" x="142" y="-258"/>
+        </menu>
+        <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <rect key="contentRect" x="335" y="390" width="800" height="600"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/>
+            <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
+                <rect key="frame" x="0.0" y="0.0" width="800" height="600"/>
+                <autoresizingMask key="autoresizingMask"/>
+            </view>
+        </window>
+    </objects>
+</document>
diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 00000000..b3746969
--- /dev/null
+++ b/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = gecko
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.example.gecko
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved.
diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 00000000..36b0fd94
--- /dev/null
+++ b/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 00000000..dff4f495
--- /dev/null
+++ b/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 00000000..42bcbf47
--- /dev/null
+++ b/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 00000000..dddb8a30
--- /dev/null
+++ b/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
+	<key>com.apple.security.cs.allow-jit</key>
+	<true/>
+	<key>com.apple.security.network.server</key>
+	<true/>
+</dict>
+</plist>
diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist
new file mode 100644
index 00000000..4789daa6
--- /dev/null
+++ b/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>$(FLUTTER_BUILD_NAME)</string>
+	<key>CFBundleVersion</key>
+	<string>$(FLUTTER_BUILD_NUMBER)</string>
+	<key>LSMinimumSystemVersion</key>
+	<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>$(PRODUCT_COPYRIGHT)</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+</dict>
+</plist>
diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 00000000..2722837e
--- /dev/null
+++ b/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+  override func awakeFromNib() {
+    let flutterViewController = FlutterViewController.init()
+    let windowFrame = self.frame
+    self.contentViewController = flutterViewController
+    self.setFrame(windowFrame, display: true)
+
+    RegisterGeneratedPlugins(registry: flutterViewController)
+
+    super.awakeFromNib()
+  }
+}
diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements
new file mode 100644
index 00000000..852fa1a4
--- /dev/null
+++ b/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
+</dict>
+</plist>
diff --git a/pubspec.lock b/pubspec.lock
index fcfb1abe..7ff1640c 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -326,6 +326,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.9.2"
+  flutter_lints:
+    dependency: "direct main"
+    description:
+      name: flutter_lints
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.4"
   flutter_logs:
     dependency: "direct main"
     description:
@@ -577,6 +584,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "4.3.0"
+  lints:
+    dependency: transitive
+    description:
+      name: lints
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.1"
   logger:
     dependency: "direct main"
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 9ee5f914..b5a9772b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -55,6 +55,7 @@ dependencies:
   xml: ^5.3.0
   assorted_layout_widgets: ^5.2.1
   carousel_slider: ^4.0.0
+  flutter_lints: ^1.0.4
 
 flutter_icons:
   android: "ic_launcher"
diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart
index c5408365..72a15f90 100644
--- a/test_driver/app_test.dart
+++ b/test_driver/app_test.dart
@@ -2,6 +2,7 @@
 import 'dart:async';
 import 'dart:io';
 import 'package:flutter_driver/flutter_driver.dart';
+import 'package:gecko/globals.dart';
 import 'package:test/test.dart';
 // import 'package:flutter/services.dart';
 
@@ -108,7 +109,7 @@ void main() {
       await sleep(300);
       await tapOn('generateKeychain');
       while (await getText('generatedPin') == '') {
-        print('Waiting for pin code generation...');
+        log.i('Waiting for pin code generation...');
         await sleep(100);
       }
       pinCode = await getText('generatedPin');
@@ -125,13 +126,10 @@ void main() {
     // *** Begin of tests *** //
 
     test('OnBoarding - Open wallets management', (
-        {timeout: Timeout.none}) async {
+        {timeout = Timeout.none}) async {
       // await driver.runUnsynchronized(() async { // Needed if we want to manage async drivers
       await driver.tap(manageWalletsFinder);
 
-      print(
-          '####################################################################');
-
       // If a wallet exist, go to delete theme all
       if (!await isPresent(find.byValueKey('goStep1'))) {
         await goBack();
@@ -154,7 +152,7 @@ void main() {
     });
 
     test('OnBoarding - Go to create restore sentance', (
-        {timeout: Timeout.none}) async {
+        {timeout = Timeout.none}) async {
       await tapOn('goStep1');
       await tapOn('goStep2');
       await tapOn('goStep3');
@@ -170,11 +168,11 @@ void main() {
     });
 
     test('OnBoarding - Generate sentance and confirme it', (
-        {timeout: Timeout.none}) async {
+        {timeout = Timeout.none}) async {
       await tapOn('goStep7');
 
       while (await getText('word1') == '...') {
-        print('Waiting for Mnemonic generation...');
+        log.i('Waiting for Mnemonic generation...');
         await sleep(100);
       }
 
@@ -220,7 +218,7 @@ void main() {
       await selectWord();
     });
     test('OnBoarding - Generate secret code and confirm it', (
-        {timeout: Timeout.none}) async {
+        {timeout = Timeout.none}) async {
       expect(await getText('step9'),
           "Super !\n\nJe vais maintenant créer votre code secret. \n\nVotre code secret chiffre votre trousseau de clefs, ce qui le rend inutilisable par d’autres, par exemple si vous perdez votre téléphone ou si on vous le vole.");
 
@@ -228,12 +226,14 @@ void main() {
       await tapOn('goStep11');
 
       while (await getText('generatedPin') == '') {
-        print('Waiting for pin code generation...');
+        log.i('Waiting for pin code generation...');
         await sleep(100);
       }
 
       // Change secret code 4 times
-      for (int i = 0; i < 4; i++) await tapOn('changeSecretCode');
+      for (int i = 0; i < 4; i++) {
+        await tapOn('changeSecretCode');
+      }
 
       await sleep(500);
       pinCode = await getText('generatedPin');
@@ -255,7 +255,7 @@ void main() {
     });
 
     test('My wallets - Rename first derivation', (
-        {timeout: const Duration(seconds: 2)}) async {
+        {timeout = const Duration(seconds: 2)}) async {
       await tapOn('goWalletHome');
 
       expect(await getText('myWallets'), "Mes portefeuilles");
@@ -278,7 +278,7 @@ void main() {
     });
 
     test('My wallets - Create a derivations, open thems, tap all buttons', (
-        {timeout: const Duration(seconds: 2)}) async {
+        {timeout = const Duration(seconds: 2)}) async {
       await driver.waitFor(find.text('Renommage wallet 1'), timeout: timeout);
       // Add a second derivation
       await createDerivation('Derivation 2');
@@ -321,7 +321,7 @@ void main() {
     });
 
     test('My wallets - Extra tests', (
-        {timeout: const Duration(seconds: 2)}) async {
+        {timeout = const Duration(seconds: 2)}) async {
       // Add derivation 5,6 and 7
       await driver.waitFor(find.text('Derivation 4'), timeout: timeout);
       await createDerivation('Derivation 5');
@@ -404,7 +404,7 @@ void main() {
     });
 
     test('Search - Search Pi profile, navigate in history transactions', (
-        {timeout: const Duration(seconds: 2)}) async {
+        {timeout = const Duration(seconds: 2)}) async {
       await driver.waitFor(find.text('Derivation 20'), timeout: timeout);
       await goBack();
       await goBack();
@@ -436,7 +436,7 @@ void main() {
     }, timeout: Timeout(Duration(minutes: globalTimeout)));
 
     test('Wallet generation - Fast wallets generations', (
-        {timeout: const Duration(seconds: 2)}) async {
+        {timeout = const Duration(seconds: 2)}) async {
       await driver.waitFor(find.text('Commentaire:'), timeout: timeout);
       await goBack();
       await goBack();
diff --git a/windows/.gitignore b/windows/.gitignore
new file mode 100644
index 00000000..d492d0d9
--- /dev/null
+++ b/windows/.gitignore
@@ -0,0 +1,17 @@
+flutter/ephemeral/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt
new file mode 100644
index 00000000..5d613678
--- /dev/null
+++ b/windows/CMakeLists.txt
@@ -0,0 +1,95 @@
+cmake_minimum_required(VERSION 3.15)
+project(gecko LANGUAGES CXX)
+
+set(BINARY_NAME "gecko")
+
+cmake_policy(SET CMP0063 NEW)
+
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Configure build options.
+get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(IS_MULTICONFIG)
+  set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
+    CACHE STRING "" FORCE)
+else()
+  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+    set(CMAKE_BUILD_TYPE "Debug" CACHE
+      STRING "Flutter build mode" FORCE)
+    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+      "Debug" "Profile" "Release")
+  endif()
+endif()
+
+set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
+set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
+
+# Use Unicode for all projects.
+add_definitions(-DUNICODE -D_UNICODE)
+
+# Compilation settings that should be applied to most targets.
+function(APPLY_STANDARD_SETTINGS TARGET)
+  target_compile_features(${TARGET} PUBLIC cxx_std_17)
+  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
+  target_compile_options(${TARGET} PRIVATE /EHsc)
+  target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
+  target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
+endfunction()
+
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+
+# Flutter library and tool build rules.
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# Application build
+add_subdirectory("runner")
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# Support files are copied into place next to the executable, so that it can
+# run in place. This is done instead of making a separate bundle (as on Linux)
+# so that building and running from within Visual Studio will work.
+set(BUILD_BUNDLE_DIR "$<TARGET_FILE_DIR:${BINARY_NAME}>")
+# Make the "install" step default, as it's required to run.
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+  COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+  COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+  COMPONENT Runtime)
+
+if(PLUGIN_BUNDLED_LIBRARIES)
+  install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
+    DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+    COMPONENT Runtime)
+endif()
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+  file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+  " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+  DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+  CONFIGURATIONS Profile;Release
+  COMPONENT Runtime)
diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt
new file mode 100644
index 00000000..b02c5485
--- /dev/null
+++ b/windows/flutter/CMakeLists.txt
@@ -0,0 +1,103 @@
+cmake_minimum_required(VERSION 3.15)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
+
+# === Flutter Library ===
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+  "flutter_export.h"
+  "flutter_windows.h"
+  "flutter_messenger.h"
+  "flutter_plugin_registrar.h"
+  "flutter_texture_registrar.h"
+)
+list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+  "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
+add_dependencies(flutter flutter_assemble)
+
+# === Wrapper ===
+list(APPEND CPP_WRAPPER_SOURCES_CORE
+  "core_implementations.cc"
+  "standard_codec.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
+  "plugin_registrar.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_APP
+  "flutter_engine.cc"
+  "flutter_view_controller.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
+
+# Wrapper sources needed for a plugin.
+add_library(flutter_wrapper_plugin STATIC
+  ${CPP_WRAPPER_SOURCES_CORE}
+  ${CPP_WRAPPER_SOURCES_PLUGIN}
+)
+apply_standard_settings(flutter_wrapper_plugin)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+  POSITION_INDEPENDENT_CODE ON)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+  CXX_VISIBILITY_PRESET hidden)
+target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
+target_include_directories(flutter_wrapper_plugin PUBLIC
+  "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_plugin flutter_assemble)
+
+# Wrapper sources needed for the runner.
+add_library(flutter_wrapper_app STATIC
+  ${CPP_WRAPPER_SOURCES_CORE}
+  ${CPP_WRAPPER_SOURCES_APP}
+)
+apply_standard_settings(flutter_wrapper_app)
+target_link_libraries(flutter_wrapper_app PUBLIC flutter)
+target_include_directories(flutter_wrapper_app PUBLIC
+  "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_app flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
+set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
+add_custom_command(
+  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
+    ${CPP_WRAPPER_SOURCES_APP}
+    ${PHONY_OUTPUT}
+  COMMAND ${CMAKE_COMMAND} -E env
+    ${FLUTTER_TOOL_ENVIRONMENT}
+    "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
+      windows-x64 $<CONFIG>
+  VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+  "${FLUTTER_LIBRARY}"
+  ${FLUTTER_LIBRARY_HEADERS}
+  ${CPP_WRAPPER_SOURCES_CORE}
+  ${CPP_WRAPPER_SOURCES_PLUGIN}
+  ${CPP_WRAPPER_SOURCES_APP}
+)
diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..25cb188e
--- /dev/null
+++ b/windows/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,20 @@
+//
+//  Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include <connectivity_plus_windows/connectivity_plus_windows_plugin.h>
+#include <printing/printing_plugin.h>
+#include <sentry_flutter/sentry_flutter_plugin.h>
+
+void RegisterPlugins(flutter::PluginRegistry* registry) {
+  ConnectivityPlusWindowsPluginRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
+  PrintingPluginRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("PrintingPlugin"));
+  SentryFlutterPluginRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("SentryFlutterPlugin"));
+}
diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h
new file mode 100644
index 00000000..dc139d85
--- /dev/null
+++ b/windows/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+//  Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include <flutter/plugin_registry.h>
+
+// Registers Flutter plugins.
+void RegisterPlugins(flutter::PluginRegistry* registry);
+
+#endif  // GENERATED_PLUGIN_REGISTRANT_
diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake
new file mode 100644
index 00000000..fcd7a403
--- /dev/null
+++ b/windows/flutter/generated_plugins.cmake
@@ -0,0 +1,18 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+  connectivity_plus_windows
+  printing
+  sentry_flutter
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
+  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt
new file mode 100644
index 00000000..0b899a0b
--- /dev/null
+++ b/windows/runner/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 3.15)
+project(runner LANGUAGES CXX)
+
+add_executable(${BINARY_NAME} WIN32
+  "flutter_window.cpp"
+  "main.cpp"
+  "utils.cpp"
+  "win32_window.cpp"
+  "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+  "Runner.rc"
+  "runner.exe.manifest"
+)
+apply_standard_settings(${BINARY_NAME})
+target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
+target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc
new file mode 100644
index 00000000..ed275d2e
--- /dev/null
+++ b/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+    "#include ""winres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON            ICON                    "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#ifdef FLUTTER_BUILD_NUMBER
+#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER
+#else
+#define VERSION_AS_NUMBER 1,0,0
+#endif
+
+#ifdef FLUTTER_BUILD_NAME
+#define VERSION_AS_STRING #FLUTTER_BUILD_NAME
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904e4"
+        BEGIN
+            VALUE "CompanyName", "com.example" "\0"
+            VALUE "FileDescription", "A new Flutter project." "\0"
+            VALUE "FileVersion", VERSION_AS_STRING "\0"
+            VALUE "InternalName", "gecko" "\0"
+            VALUE "LegalCopyright", "Copyright (C) 2021 com.example. All rights reserved." "\0"
+            VALUE "OriginalFilename", "gecko.exe" "\0"
+            VALUE "ProductName", "gecko" "\0"
+            VALUE "ProductVersion", VERSION_AS_STRING "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1252
+    END
+END
+
+#endif    // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp
new file mode 100644
index 00000000..b43b9095
--- /dev/null
+++ b/windows/runner/flutter_window.cpp
@@ -0,0 +1,61 @@
+#include "flutter_window.h"
+
+#include <optional>
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+    : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+  if (!Win32Window::OnCreate()) {
+    return false;
+  }
+
+  RECT frame = GetClientArea();
+
+  // The size here must match the window dimensions to avoid unnecessary surface
+  // creation / destruction in the startup path.
+  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(
+      frame.right - frame.left, frame.bottom - frame.top, project_);
+  // Ensure that basic setup of the controller was successful.
+  if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+    return false;
+  }
+  RegisterPlugins(flutter_controller_->engine());
+  SetChildContent(flutter_controller_->view()->GetNativeWindow());
+  return true;
+}
+
+void FlutterWindow::OnDestroy() {
+  if (flutter_controller_) {
+    flutter_controller_ = nullptr;
+  }
+
+  Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+                              WPARAM const wparam,
+                              LPARAM const lparam) noexcept {
+  // Give Flutter, including plugins, an opportunity to handle window messages.
+  if (flutter_controller_) {
+    std::optional<LRESULT> result =
+        flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+                                                      lparam);
+    if (result) {
+      return *result;
+    }
+  }
+
+  switch (message) {
+    case WM_FONTCHANGE:
+      flutter_controller_->engine()->ReloadSystemFonts();
+      break;
+  }
+
+  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h
new file mode 100644
index 00000000..6da0652f
--- /dev/null
+++ b/windows/runner/flutter_window.h
@@ -0,0 +1,33 @@
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include <flutter/dart_project.h>
+#include <flutter/flutter_view_controller.h>
+
+#include <memory>
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+  // Creates a new FlutterWindow hosting a Flutter view running |project|.
+  explicit FlutterWindow(const flutter::DartProject& project);
+  virtual ~FlutterWindow();
+
+ protected:
+  // Win32Window:
+  bool OnCreate() override;
+  void OnDestroy() override;
+  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+                         LPARAM const lparam) noexcept override;
+
+ private:
+  // The project to run.
+  flutter::DartProject project_;
+
+  // The Flutter instance hosted by this window.
+  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;
+};
+
+#endif  // RUNNER_FLUTTER_WINDOW_H_
diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp
new file mode 100644
index 00000000..aa55141c
--- /dev/null
+++ b/windows/runner/main.cpp
@@ -0,0 +1,43 @@
+#include <flutter/dart_project.h>
+#include <flutter/flutter_view_controller.h>
+#include <windows.h>
+
+#include "flutter_window.h"
+#include "utils.h"
+
+int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
+                      _In_ wchar_t *command_line, _In_ int show_command) {
+  // Attach to console when present (e.g., 'flutter run') or create a
+  // new console when running with a debugger.
+  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+    CreateAndAttachConsole();
+  }
+
+  // Initialize COM, so that it is available for use in the library and/or
+  // plugins.
+  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+
+  flutter::DartProject project(L"data");
+
+  std::vector<std::string> command_line_arguments =
+      GetCommandLineArguments();
+
+  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
+
+  FlutterWindow window(project);
+  Win32Window::Point origin(10, 10);
+  Win32Window::Size size(1280, 720);
+  if (!window.CreateAndShow(L"gecko", origin, size)) {
+    return EXIT_FAILURE;
+  }
+  window.SetQuitOnClose(true);
+
+  ::MSG msg;
+  while (::GetMessage(&msg, nullptr, 0, 0)) {
+    ::TranslateMessage(&msg);
+    ::DispatchMessage(&msg);
+  }
+
+  ::CoUninitialize();
+  return EXIT_SUCCESS;
+}
diff --git a/windows/runner/resource.h b/windows/runner/resource.h
new file mode 100644
index 00000000..66a65d1e
--- /dev/null
+++ b/windows/runner/resource.h
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Runner.rc
+//
+#define IDI_APP_ICON                    101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        102
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6
GIT binary patch
literal 33772
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

literal 0
HcmV?d00001

diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest
new file mode 100644
index 00000000..c977c4a4
--- /dev/null
+++ b/windows/runner/runner.exe.manifest
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+  <application xmlns="urn:schemas-microsoft-com:asm.v3">
+    <windowsSettings>
+      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+    </windowsSettings>
+  </application>
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+    <application>
+      <!-- Windows 10 -->
+      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+      <!-- Windows 8.1 -->
+      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+      <!-- Windows 8 -->
+      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+      <!-- Windows 7 -->
+      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+    </application>
+  </compatibility>
+</assembly>
diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp
new file mode 100644
index 00000000..d19bdbbc
--- /dev/null
+++ b/windows/runner/utils.cpp
@@ -0,0 +1,64 @@
+#include "utils.h"
+
+#include <flutter_windows.h>
+#include <io.h>
+#include <stdio.h>
+#include <windows.h>
+
+#include <iostream>
+
+void CreateAndAttachConsole() {
+  if (::AllocConsole()) {
+    FILE *unused;
+    if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
+      _dup2(_fileno(stdout), 1);
+    }
+    if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
+      _dup2(_fileno(stdout), 2);
+    }
+    std::ios::sync_with_stdio();
+    FlutterDesktopResyncOutputStreams();
+  }
+}
+
+std::vector<std::string> GetCommandLineArguments() {
+  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
+  int argc;
+  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
+  if (argv == nullptr) {
+    return std::vector<std::string>();
+  }
+
+  std::vector<std::string> command_line_arguments;
+
+  // Skip the first argument as it's the binary name.
+  for (int i = 1; i < argc; i++) {
+    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
+  }
+
+  ::LocalFree(argv);
+
+  return command_line_arguments;
+}
+
+std::string Utf8FromUtf16(const wchar_t* utf16_string) {
+  if (utf16_string == nullptr) {
+    return std::string();
+  }
+  int target_length = ::WideCharToMultiByte(
+      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+      -1, nullptr, 0, nullptr, nullptr);
+  if (target_length == 0) {
+    return std::string();
+  }
+  std::string utf8_string;
+  utf8_string.resize(target_length);
+  int converted_length = ::WideCharToMultiByte(
+      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+      -1, utf8_string.data(),
+      target_length, nullptr, nullptr);
+  if (converted_length == 0) {
+    return std::string();
+  }
+  return utf8_string;
+}
diff --git a/windows/runner/utils.h b/windows/runner/utils.h
new file mode 100644
index 00000000..3879d547
--- /dev/null
+++ b/windows/runner/utils.h
@@ -0,0 +1,19 @@
+#ifndef RUNNER_UTILS_H_
+#define RUNNER_UTILS_H_
+
+#include <string>
+#include <vector>
+
+// Creates a console for the process, and redirects stdout and stderr to
+// it for both the runner and the Flutter library.
+void CreateAndAttachConsole();
+
+// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
+// encoded in UTF-8. Returns an empty std::string on failure.
+std::string Utf8FromUtf16(const wchar_t* utf16_string);
+
+// Gets the command line arguments passed in as a std::vector<std::string>,
+// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.
+std::vector<std::string> GetCommandLineArguments();
+
+#endif  // RUNNER_UTILS_H_
diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp
new file mode 100644
index 00000000..c10f08dc
--- /dev/null
+++ b/windows/runner/win32_window.cpp
@@ -0,0 +1,245 @@
+#include "win32_window.h"
+
+#include <flutter_windows.h>
+
+#include "resource.h"
+
+namespace {
+
+constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
+
+// The number of Win32Window objects that currently exist.
+static int g_active_window_count = 0;
+
+using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
+
+// Scale helper to convert logical scaler values to physical using passed in
+// scale factor
+int Scale(int source, double scale_factor) {
+  return static_cast<int>(source * scale_factor);
+}
+
+// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
+// This API is only needed for PerMonitor V1 awareness mode.
+void EnableFullDpiSupportIfAvailable(HWND hwnd) {
+  HMODULE user32_module = LoadLibraryA("User32.dll");
+  if (!user32_module) {
+    return;
+  }
+  auto enable_non_client_dpi_scaling =
+      reinterpret_cast<EnableNonClientDpiScaling*>(
+          GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
+  if (enable_non_client_dpi_scaling != nullptr) {
+    enable_non_client_dpi_scaling(hwnd);
+    FreeLibrary(user32_module);
+  }
+}
+
+}  // namespace
+
+// Manages the Win32Window's window class registration.
+class WindowClassRegistrar {
+ public:
+  ~WindowClassRegistrar() = default;
+
+  // Returns the singleton registar instance.
+  static WindowClassRegistrar* GetInstance() {
+    if (!instance_) {
+      instance_ = new WindowClassRegistrar();
+    }
+    return instance_;
+  }
+
+  // Returns the name of the window class, registering the class if it hasn't
+  // previously been registered.
+  const wchar_t* GetWindowClass();
+
+  // Unregisters the window class. Should only be called if there are no
+  // instances of the window.
+  void UnregisterWindowClass();
+
+ private:
+  WindowClassRegistrar() = default;
+
+  static WindowClassRegistrar* instance_;
+
+  bool class_registered_ = false;
+};
+
+WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
+
+const wchar_t* WindowClassRegistrar::GetWindowClass() {
+  if (!class_registered_) {
+    WNDCLASS window_class{};
+    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
+    window_class.lpszClassName = kWindowClassName;
+    window_class.style = CS_HREDRAW | CS_VREDRAW;
+    window_class.cbClsExtra = 0;
+    window_class.cbWndExtra = 0;
+    window_class.hInstance = GetModuleHandle(nullptr);
+    window_class.hIcon =
+        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
+    window_class.hbrBackground = 0;
+    window_class.lpszMenuName = nullptr;
+    window_class.lpfnWndProc = Win32Window::WndProc;
+    RegisterClass(&window_class);
+    class_registered_ = true;
+  }
+  return kWindowClassName;
+}
+
+void WindowClassRegistrar::UnregisterWindowClass() {
+  UnregisterClass(kWindowClassName, nullptr);
+  class_registered_ = false;
+}
+
+Win32Window::Win32Window() {
+  ++g_active_window_count;
+}
+
+Win32Window::~Win32Window() {
+  --g_active_window_count;
+  Destroy();
+}
+
+bool Win32Window::CreateAndShow(const std::wstring& title,
+                                const Point& origin,
+                                const Size& size) {
+  Destroy();
+
+  const wchar_t* window_class =
+      WindowClassRegistrar::GetInstance()->GetWindowClass();
+
+  const POINT target_point = {static_cast<LONG>(origin.x),
+                              static_cast<LONG>(origin.y)};
+  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
+  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
+  double scale_factor = dpi / 96.0;
+
+  HWND window = CreateWindow(
+      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
+      Scale(size.width, scale_factor), Scale(size.height, scale_factor),
+      nullptr, nullptr, GetModuleHandle(nullptr), this);
+
+  if (!window) {
+    return false;
+  }
+
+  return OnCreate();
+}
+
+// static
+LRESULT CALLBACK Win32Window::WndProc(HWND const window,
+                                      UINT const message,
+                                      WPARAM const wparam,
+                                      LPARAM const lparam) noexcept {
+  if (message == WM_NCCREATE) {
+    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);
+    SetWindowLongPtr(window, GWLP_USERDATA,
+                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));
+
+    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);
+    EnableFullDpiSupportIfAvailable(window);
+    that->window_handle_ = window;
+  } else if (Win32Window* that = GetThisFromHandle(window)) {
+    return that->MessageHandler(window, message, wparam, lparam);
+  }
+
+  return DefWindowProc(window, message, wparam, lparam);
+}
+
+LRESULT
+Win32Window::MessageHandler(HWND hwnd,
+                            UINT const message,
+                            WPARAM const wparam,
+                            LPARAM const lparam) noexcept {
+  switch (message) {
+    case WM_DESTROY:
+      window_handle_ = nullptr;
+      Destroy();
+      if (quit_on_close_) {
+        PostQuitMessage(0);
+      }
+      return 0;
+
+    case WM_DPICHANGED: {
+      auto newRectSize = reinterpret_cast<RECT*>(lparam);
+      LONG newWidth = newRectSize->right - newRectSize->left;
+      LONG newHeight = newRectSize->bottom - newRectSize->top;
+
+      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
+                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
+
+      return 0;
+    }
+    case WM_SIZE: {
+      RECT rect = GetClientArea();
+      if (child_content_ != nullptr) {
+        // Size and position the child window.
+        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
+                   rect.bottom - rect.top, TRUE);
+      }
+      return 0;
+    }
+
+    case WM_ACTIVATE:
+      if (child_content_ != nullptr) {
+        SetFocus(child_content_);
+      }
+      return 0;
+  }
+
+  return DefWindowProc(window_handle_, message, wparam, lparam);
+}
+
+void Win32Window::Destroy() {
+  OnDestroy();
+
+  if (window_handle_) {
+    DestroyWindow(window_handle_);
+    window_handle_ = nullptr;
+  }
+  if (g_active_window_count == 0) {
+    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
+  }
+}
+
+Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
+  return reinterpret_cast<Win32Window*>(
+      GetWindowLongPtr(window, GWLP_USERDATA));
+}
+
+void Win32Window::SetChildContent(HWND content) {
+  child_content_ = content;
+  SetParent(content, window_handle_);
+  RECT frame = GetClientArea();
+
+  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
+             frame.bottom - frame.top, true);
+
+  SetFocus(child_content_);
+}
+
+RECT Win32Window::GetClientArea() {
+  RECT frame;
+  GetClientRect(window_handle_, &frame);
+  return frame;
+}
+
+HWND Win32Window::GetHandle() {
+  return window_handle_;
+}
+
+void Win32Window::SetQuitOnClose(bool quit_on_close) {
+  quit_on_close_ = quit_on_close;
+}
+
+bool Win32Window::OnCreate() {
+  // No-op; provided for subclasses.
+  return true;
+}
+
+void Win32Window::OnDestroy() {
+  // No-op; provided for subclasses.
+}
diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h
new file mode 100644
index 00000000..17ba4311
--- /dev/null
+++ b/windows/runner/win32_window.h
@@ -0,0 +1,98 @@
+#ifndef RUNNER_WIN32_WINDOW_H_
+#define RUNNER_WIN32_WINDOW_H_
+
+#include <windows.h>
+
+#include <functional>
+#include <memory>
+#include <string>
+
+// A class abstraction for a high DPI-aware Win32 Window. Intended to be
+// inherited from by classes that wish to specialize with custom
+// rendering and input handling
+class Win32Window {
+ public:
+  struct Point {
+    unsigned int x;
+    unsigned int y;
+    Point(unsigned int x, unsigned int y) : x(x), y(y) {}
+  };
+
+  struct Size {
+    unsigned int width;
+    unsigned int height;
+    Size(unsigned int width, unsigned int height)
+        : width(width), height(height) {}
+  };
+
+  Win32Window();
+  virtual ~Win32Window();
+
+  // Creates and shows a win32 window with |title| and position and size using
+  // |origin| and |size|. New windows are created on the default monitor. Window
+  // sizes are specified to the OS in physical pixels, hence to ensure a
+  // consistent size to will treat the width height passed in to this function
+  // as logical pixels and scale to appropriate for the default monitor. Returns
+  // true if the window was created successfully.
+  bool CreateAndShow(const std::wstring& title,
+                     const Point& origin,
+                     const Size& size);
+
+  // Release OS resources associated with window.
+  void Destroy();
+
+  // Inserts |content| into the window tree.
+  void SetChildContent(HWND content);
+
+  // Returns the backing Window handle to enable clients to set icon and other
+  // window properties. Returns nullptr if the window has been destroyed.
+  HWND GetHandle();
+
+  // If true, closing this window will quit the application.
+  void SetQuitOnClose(bool quit_on_close);
+
+  // Return a RECT representing the bounds of the current client area.
+  RECT GetClientArea();
+
+ protected:
+  // Processes and route salient window messages for mouse handling,
+  // size change and DPI. Delegates handling of these to member overloads that
+  // inheriting classes can handle.
+  virtual LRESULT MessageHandler(HWND window,
+                                 UINT const message,
+                                 WPARAM const wparam,
+                                 LPARAM const lparam) noexcept;
+
+  // Called when CreateAndShow is called, allowing subclass window-related
+  // setup. Subclasses should return false if setup fails.
+  virtual bool OnCreate();
+
+  // Called when Destroy is called.
+  virtual void OnDestroy();
+
+ private:
+  friend class WindowClassRegistrar;
+
+  // OS callback called by message pump. Handles the WM_NCCREATE message which
+  // is passed when the non-client area is being created and enables automatic
+  // non-client DPI scaling so that the non-client area automatically
+  // responsponds to changes in DPI. All other messages are handled by
+  // MessageHandler.
+  static LRESULT CALLBACK WndProc(HWND const window,
+                                  UINT const message,
+                                  WPARAM const wparam,
+                                  LPARAM const lparam) noexcept;
+
+  // Retrieves a class instance pointer for |window|
+  static Win32Window* GetThisFromHandle(HWND const window) noexcept;
+
+  bool quit_on_close_ = false;
+
+  // window handle for top level window.
+  HWND window_handle_ = nullptr;
+
+  // window handle for hosted content.
+  HWND child_content_ = nullptr;
+};
+
+#endif  // RUNNER_WIN32_WINDOW_H_
-- 
GitLab