diff --git a/android/gradle.properties b/android/gradle.properties
index 4d8dcd2635bb8701e212029096d53cf5dc060e45..62205f40150696555e74bed7fbf2f63d6f99f49b 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.40
-app.versionCode=40
+app.versionName=0.0.41
+app.versionCode=41
diff --git a/fastlane/metadata/android/en-US/changelogs/41.txt b/fastlane/metadata/android/en-US/changelogs/41.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1892140de5f8dc7b06b43afcb953195c6edfaec3
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/41.txt
@@ -0,0 +1 @@
+Upgrade flutter framework and dependencies, fix/clean code
diff --git a/fastlane/metadata/android/fr-FR/changelogs/41.txt b/fastlane/metadata/android/fr-FR/changelogs/41.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1d4681d1041d33f20a333b859473816820f97e72
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/41.txt
@@ -0,0 +1 @@
+Mise à jour du framework Flutter, corrections/améliorations de code
diff --git a/lib/entities/moving_tile.dart b/lib/entities/moving_tile.dart
index 63dc084c84f9d56eae048396e85f7a78774d4a73..fc8d41a8f569d37a735381fc3559751af81df04f 100644
--- a/lib/entities/moving_tile.dart
+++ b/lib/entities/moving_tile.dart
@@ -20,51 +20,55 @@ class MovingTile extends Tile {
         ),
       ),
       child: Image(
-          image: this.image.image, width: this.size, height: this.size, fit: BoxFit.fill),
+        image: this.image.image,
+        width: this.size,
+        height: this.size,
+        fit: BoxFit.fill,
+      ),
     );
   }
 
   Container widget(Data myProvider) {
     return Container(
-        child: DragTarget<List<int>>(
-      builder: (
-        BuildContext context,
-        List<dynamic> accepted,
-        List<dynamic> rejected,
-      ) {
-        return Container(
-          height: this.size,
-          width: this.size,
-          color: Colors.cyan,
-          child: Draggable<List<int>>(
-            data: [
-              this.currentCol,
-              this.currentRow,
-            ],
+      child: DragTarget<List<int>>(
+        builder: (
+          BuildContext context,
+          List<dynamic> accepted,
+          List<dynamic> rejected,
+        ) {
+          return Container(
+            height: this.size,
+            width: this.size,
+            color: Colors.cyan,
+            child: Draggable<List<int>>(
+              data: [
+                this.currentCol,
+                this.currentRow,
+              ],
 
-            // Widget when draggable is stationary
-            child: this._tileWidget(),
+              // Widget when draggable is stationary
+              child: this._tileWidget(),
 
-            // Widget when draggable is being dragged
-            feedback: this._tileWidget(),
+              // Widget when draggable is being dragged
+              feedback: this._tileWidget(),
 
-            // Widget to display on original place when being dragged
-            childWhenDragging: Container(
-              height: this.size,
-              width: this.size,
-              color: Colors.pinkAccent,
+              // Widget to display on original place when being dragged
+              childWhenDragging: Container(
+                height: this.size,
+                width: this.size,
+                color: Colors.pinkAccent,
+              ),
             ),
-          ),
-        );
-      },
-      onAccept: (List<int> data) {
-        myProvider.swapTiles([this.currentCol, this.currentRow], data);
-      },
-    ));
+          );
+        },
+        onAccept: (List<int> data) {
+          myProvider.swapTiles([this.currentCol, this.currentRow], data);
+        },
+      ),
+    );
   }
 
   bool isCorrect() {
-    return ((this.currentRow == this.originalRow) &&
-        (this.currentCol == this.originalCol));
+    return ((this.currentRow == this.originalRow) && (this.currentCol == this.originalCol));
   }
 }
diff --git a/lib/main.dart b/lib/main.dart
index dd1afff2ab481d34fc88bd2e0751f294b17f42ed..af052e9532a516544ad6c7b505202015c9f5d681 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -16,19 +16,21 @@ class MyApp extends StatelessWidget {
   Widget build(BuildContext context) {
     return ChangeNotifierProvider(
       create: (BuildContext context) => Data(),
-      child: Consumer<Data>(builder: (context, data, child) {
-        return MaterialApp(
-          debugShowCheckedModeBanner: false,
-          theme: ThemeData(
-            primaryColor: Colors.blue,
-            visualDensity: VisualDensity.adaptivePlatformDensity,
-          ),
-          home: Home(),
-          routes: {
-            Home.id: (context) => Home(),
-          },
-        );
-      }),
+      child: Consumer<Data>(
+        builder: (context, data, child) {
+          return MaterialApp(
+            debugShowCheckedModeBanner: false,
+            theme: ThemeData(
+              primaryColor: Colors.blue,
+              visualDensity: VisualDensity.adaptivePlatformDensity,
+            ),
+            home: Home(),
+            routes: {
+              Home.id: (context) => Home(),
+            },
+          );
+        },
+      ),
     );
   }
 }
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 362981de42bc7f4be8d7c970970ce0f1d50bf247..f954001886496c618e2a8715eb08a9cfe44b753d 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -9,7 +9,7 @@ class Data extends ChangeNotifier {
   // application data
   List _images = [];
   String _image = '';
-  List _tiles = [];
+  List<MovingTile> _tiles = [];
 
   // application state
   bool _isShufflingBoard = false;
@@ -36,9 +36,9 @@ class Data extends ChangeNotifier {
     notifyListeners();
   }
 
-  List get tiles => _tiles;
+  List<MovingTile> get tiles => _tiles;
 
-  set updateTiles(List value) {
+  set updateTiles(List<MovingTile> value) {
     _tiles = value;
     notifyListeners();
   }
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 9becc8c2a94ad6d77ab668d9c38f2567273b57c2..0c59d361d9cc1f606b2774e07f634e4707baad83 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -36,14 +36,13 @@ class Home extends StatelessWidget {
     GetImagesList getImagesList;
     getImagesList = GetImagesList();
     await getImagesList.init();
-    if (getImagesList.images != null) {
+    if (getImagesList.images.isNotEmpty) {
       myProvider.updateImages = getImagesList.images;
       shuffleImages(myProvider);
     }
   }
 
-  Future<void> selectImage(
-      Data myProvider, String imageCode, double tileImageSize) async {
+  Future<void> selectImage(Data myProvider, String imageCode, double tileImageSize) async {
     myProvider.updateIsShufflingBoard = true;
     myProvider.updateImage = imageCode;
     new Timer(new Duration(seconds: 1), () {
@@ -67,11 +66,14 @@ class Home extends StatelessWidget {
           decoration: BoxDecoration(
             borderRadius: BorderRadius.circular(4),
             border: Border.all(
-              color: Colors.blue[200],
+              color: Colors.blue.shade200,
               width: 4,
             ),
           ),
-          child: Image(image: AssetImage(getImageAssetName(image)), fit: BoxFit.fill),
+          child: Image(
+            image: AssetImage(getImageAssetName(image)),
+            fit: BoxFit.fill,
+          ),
         ),
         onPressed: () {
           selectImage(myProvider, image, tileImageSize);
@@ -93,19 +95,21 @@ class Home extends StatelessWidget {
           Table(
             defaultColumnWidth: IntrinsicColumnWidth(),
             children: [
-              for (var imageIndex = 0;
-                  imageIndex < images.length;
-                  imageIndex += _selectImageColumnsCount)
-                TableRow(children: [
-                  for (var columnIndex = 0;
-                      columnIndex < _selectImageColumnsCount;
-                      columnIndex++)
-                    Column(children: [
-                      if (imageIndex + columnIndex < images.length)
-                        _buildImageSelectorItem(
-                            myProvider, images[imageIndex + columnIndex], tileImageSize)
-                    ]),
-                ]),
+              for (var imgIndex = 0;
+                  imgIndex < images.length;
+                  imgIndex += _selectImageColumnsCount)
+                TableRow(
+                  children: [
+                    for (var colIndex = 0; colIndex < _selectImageColumnsCount; colIndex++)
+                      Column(
+                        children: [
+                          if (imgIndex + colIndex < images.length)
+                            _buildImageSelectorItem(
+                                myProvider, images[imgIndex + colIndex], tileImageSize)
+                        ],
+                      ),
+                  ],
+                ),
             ],
           ),
         ],
@@ -133,7 +137,10 @@ class Home extends StatelessWidget {
           ),
         ),
         margin: EdgeInsets.all(8),
-        child: Image(image: AssetImage(assetName), fit: BoxFit.fill),
+        child: Image(
+          image: AssetImage(assetName),
+          fit: BoxFit.fill,
+        ),
       ),
       onPressed: () {
         myProvider.updateTilesCount = value;
@@ -168,7 +175,8 @@ class Home extends StatelessWidget {
   Future<void> splitImageInTiles(Data myProvider, double tileImageSize) async {
     String imageAsset = getImageAssetName(myProvider.image);
     Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List();
-    imglib.Image image = imglib.decodeImage(imageData);
+
+    imglib.Image image = imglib.decodeImage(imageData) ?? imglib.Image.fromBytes(1, 1, []);
 
     int x = 0, y = 0;
     int width = (image.width / myProvider.tilesCount).round();
@@ -177,8 +185,16 @@ class Home extends StatelessWidget {
     List<MovingTile> tiles = [];
     for (int i = 0; i < myProvider.tilesCount; i++) {
       for (int j = 0; j < myProvider.tilesCount; j++) {
+        Uint8List tileData = new Uint8List.fromList(imglib.encodeJpg(imglib.copyCrop(
+          image,
+          x,
+          y,
+          width,
+          height,
+        )));
+
         tiles.add(MovingTile(
-          Image.memory(imglib.encodeJpg(imglib.copyCrop(image, x, y, width, height))),
+          Image.memory(tileData),
           tileImageSize,
           j,
           i,
@@ -196,7 +212,7 @@ class Home extends StatelessWidget {
     myProvider.updateIsShufflingBoard = false;
   }
 
-  bool _checkTilesetIsCleared(List<Tile> tiles) {
+  bool _checkTilesetIsCleared(List<MovingTile> tiles) {
     for (Tile tile in tiles) {
       if (!tile.isCorrect()) {
         return false;
@@ -206,25 +222,28 @@ class Home extends StatelessWidget {
   }
 
   Container _buildTilesetWidget(Data myProvider) {
-    List tiles = myProvider.tiles;
+    List<MovingTile> tiles = myProvider.tiles;
 
     Color borderColor = _checkTilesetIsCleared(tiles) ? Colors.green : Colors.orange;
     int tileIndex = 0;
 
     Table tileset = Table(
-        defaultColumnWidth: IntrinsicColumnWidth(),
-        border: TableBorder.all(
-          color: Colors.black,
-          style: BorderStyle.solid,
-          width: 2,
-        ),
-        children: [
-          for (var row = 0; row < myProvider.tilesCount; row++)
-            TableRow(children: [
+      defaultColumnWidth: IntrinsicColumnWidth(),
+      border: TableBorder.all(
+        color: Colors.black,
+        style: BorderStyle.solid,
+        width: 2,
+      ),
+      children: [
+        for (var row = 0; row < myProvider.tilesCount; row++)
+          TableRow(
+            children: [
               for (var col = 0; col < myProvider.tilesCount; col++)
                 Column(children: [tiles[tileIndex++].widget(myProvider)]),
-            ]),
-        ]);
+            ],
+          ),
+      ],
+    );
 
     return Container(
       margin: EdgeInsets.all(8),
@@ -256,12 +275,15 @@ class Home extends StatelessWidget {
             ),
           ),
           child: Image(
-              image: AssetImage(myProvider.displayTipImage
+            image: AssetImage(
+              myProvider.displayTipImage
                   ? getImageAssetName(myProvider.image)
-                  : 'assets/ui/tip-hidden.png'),
-              width: _tipImageSize,
-              height: _tipImageSize,
-              fit: BoxFit.fill),
+                  : 'assets/ui/tip-hidden.png',
+            ),
+            width: _tipImageSize,
+            height: _tipImageSize,
+            fit: BoxFit.fill,
+          ),
         ),
         onPressed: () => toggleDisplayTipImage(myProvider),
       ),
@@ -286,30 +308,47 @@ class Home extends StatelessWidget {
 
   Container _buildWinMessage(Data myProvider) {
     return Container(
-        margin: EdgeInsets.all(2),
-        padding: EdgeInsets.all(2),
-        child: Table(defaultColumnWidth: IntrinsicColumnWidth(), children: [
+      margin: EdgeInsets.all(2),
+      padding: EdgeInsets.all(2),
+      child: Table(
+        defaultColumnWidth: IntrinsicColumnWidth(),
+        children: [
           TableRow(
             children: [
-              Column(children: [
-                Image(image: AssetImage('assets/icons/game_win.png'), fit: BoxFit.fill),
-              ]),
-              Column(children: [
-                TextButton(
-                  child: Container(
-                    child: Image(
+              Column(
+                children: [
+                  Image(
+                    image: AssetImage('assets/icons/game_win.png'),
+                    fit: BoxFit.fill,
+                  ),
+                ],
+              ),
+              Column(
+                children: [
+                  TextButton(
+                    child: Container(
+                      child: Image(
                         image: AssetImage('assets/icons/button_back.png'),
-                        fit: BoxFit.fill),
+                        fit: BoxFit.fill,
+                      ),
+                    ),
+                    onPressed: () => resetGame(myProvider),
                   ),
-                  onPressed: () => resetGame(myProvider),
-                ),
-              ]),
-              Column(children: [
-                Image(image: AssetImage('assets/icons/game_win.png'), fit: BoxFit.fill),
-              ]),
+                ],
+              ),
+              Column(
+                children: [
+                  Image(
+                    image: AssetImage('assets/icons/game_win.png'),
+                    fit: BoxFit.fill,
+                  ),
+                ],
+              ),
             ],
           ),
-        ]));
+        ],
+      ),
+    );
   }
 
   Container _buildShufflingIndicatorWidget() {
@@ -339,8 +378,7 @@ class Home extends StatelessWidget {
 
     var content;
 
-    double _tileImageSize =
-        (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount;
+    double _tileImageSize = (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount;
 
     if (_myProvider.isShufflingBoard) {
       content = _buildShufflingIndicatorWidget();
@@ -368,7 +406,9 @@ class Home extends StatelessWidget {
           ),
           margin: EdgeInsets.all(8),
           child: Image(
-              image: AssetImage('assets/icons/button_shuffle.png'), fit: BoxFit.fill),
+            image: AssetImage('assets/icons/button_shuffle.png'),
+            fit: BoxFit.fill,
+          ),
         ),
         onPressed: () => shuffleImages(_myProvider),
       ),
@@ -385,20 +425,23 @@ class Home extends StatelessWidget {
             ),
           ),
           margin: EdgeInsets.all(8),
-          child:
-              Image(image: AssetImage('assets/icons/button_back.png'), fit: BoxFit.fill),
+          child: Image(
+            image: AssetImage('assets/icons/button_back.png'),
+            fit: BoxFit.fill,
+          ),
         ),
         onPressed: () => resetGame(_myProvider),
       ),
     ];
 
     return Scaffold(
-        appBar: AppBar(
-          backgroundColor: themePrimaryColor,
-          actions: _myProvider.image == '' ? menuActions : gameActions,
-        ),
-        body: SafeArea(
-          child: Center(child: content),
-        ));
+      appBar: AppBar(
+        backgroundColor: themePrimaryColor,
+        actions: _myProvider.image == '' ? menuActions : gameActions,
+      ),
+      body: SafeArea(
+        child: Center(child: content),
+      ),
+    );
   }
 }
diff --git a/lib/utils/get_images_list.dart b/lib/utils/get_images_list.dart
index e1221a98f734d20c44262eacbac39460bb2908b1..3f590aa7da93f14ff54286a6c4675c9b1225436a 100644
--- a/lib/utils/get_images_list.dart
+++ b/lib/utils/get_images_list.dart
@@ -5,7 +5,7 @@ import 'package:flutter/services.dart';
 class GetImagesList {
   GetImagesList();
 
-  List _images;
+  List _images = [];
 
   init() async {
     await imagesFromLocalFile();
diff --git a/pubspec.lock b/pubspec.lock
index 9fbac1cb2c42d5a5831c7d20b476b98478f8e075..572027bd77a77a46a4c3f8be3b25707e81d26b5e 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,7 +7,7 @@ packages:
       name: archive
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.2.0"
+    version: "3.3.0"
   async:
     dependency: transitive
     description:
@@ -56,7 +56,7 @@ packages:
       name: crypto
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.1"
+    version: "3.0.2"
   fake_async:
     dependency: transitive
     description:
@@ -80,7 +80,7 @@ packages:
       name: image
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.1.1"
+    version: "3.2.0"
   matcher:
     dependency: transitive
     description:
@@ -122,14 +122,14 @@ packages:
       name: petitparser
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "4.4.0"
+    version: "5.0.0"
   provider:
     dependency: "direct main"
     description:
       name: provider
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "6.0.2"
+    version: "6.0.3"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -183,7 +183,7 @@ packages:
       name: typed_data
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.3.0"
+    version: "1.3.1"
   vector_math:
     dependency: transitive
     description:
@@ -197,7 +197,7 @@ packages:
       name: xml
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "5.3.1"
+    version: "6.1.0"
 sdks:
-  dart: ">=2.17.0-0 <3.0.0"
+  dart: ">=2.17.0 <3.0.0"
   flutter: ">=1.16.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index dbeeb1078d6d5be249c61700d031436a0e091833..45376e674c40baddfb088777454ef86e514fb7d4 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -4,7 +4,7 @@ publish_to: 'none'
 version: 1.0.0+1
 
 environment:
-  sdk: ">=2.7.0 <3.0.0"
+  sdk: ">=2.16.1 <3.0.0"
 
 dependencies:
   flutter: