NullSafety対応後の環境で過去プロジェクトのアプリを動作させる

# NullSafety後の環境で過去のプロジェクトを動作させる
Flutter周りは今現在も頻繁にバージョンアップが行われており、最新環境で過去のプロジェクトをcloneしたときに動作しないことがある。
今回上記の問題に直面しながらも動作まで漕ぎ着けたので、行った対応をメモベースでまとめてみた。

## pubspec.yamlで読み込んでいるライブラリのバージョンを更新する
pubspecでnull safety以前のsdkを指定している場合、pub getを行ったときに下記のようなエラーが出るため、sdkのバージョンをnull safety対応後のバージョンに指定する。

```
// エラー文
Resolving dependencies...
The lower bound of "sdk: '>=2.1.0 <3.0.0'" must be 2.12.0'
or higher to enable null safety.

The current Dart SDK (3.2.6) only supports null safety.

For details, see https://dart.dev/null-safety
exit code 65
```

```
environment:
-  sdk: ">=2.1.0 <3.0.0"
+  sdk: ">=3.2.6 <4.0.0"

```


## 廃止になったウィジェットが使われていたら修正する
```
// エラー文
The method 'FlatButton' isn't defined for the type '_StoryPageState'.
Try correcting the name to the name of an existing method, or defining a method named 'FlatButton'.
```
例えばFlatButtonなどのウィジェットは現在のバージョンでは廃止されているため、このような古いウィジェットが残っていたらビルドできない。
代替出来るウィジェットに修正する。(FlatButtonだったらElevatedButtonなどに書き換える)

## Androidの場合
Build時に下記のWarningが出る場合は、 https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects の指示に従って修正する。
下記で具体的に変更を行った箇所をまとめた。
```
// Warning
──────────────────────────────────────────────────────────────────────────────
Your Flutter application is created using an older version of the Android
embedding. It is being deprecated in favor of Android embedding v2. To migrate
your project, follow the steps at:

https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects
```

### MainActivity.java(もしくは.kt)の修正
\android\app\src\main\java\co\appbrewery\xxx(プロジェクト名)\MainActivity.java(もしくは.kt)を修正
```
// MainActivity.java
-import android.os.Bundle;
-import io.flutter.app.FlutterActivity;
+import io.flutter.embedding.android.FlutterActivity;
-import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    GeneratedPluginRegistrant.registerWith(this);
-  }
 }
```

### AndroidManifest.xmlの修正
android/app/src/main/AndroidManifest.xmlを修正

```
// AndroidManifest.xml
<application
-    android:name="io.flutter.app.FlutterApplication"
+    android:name="${applicationName}"

...

- <meta-data
-    android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
-    android:value="true" />

...

</activity>
    </application>
+    <meta-data
+        android:name="flutterEmbedding"
+        android:value="2" />
</manifest>
```

### gradleのバージョンを変更

\android\gradle\wrapper\gradle-wrapper.propertiesを修正
```
// gradle-wrapper.properties
- distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip
```

\android\build.gradleを修正
```
// build.gradle
    dependencies {
-        classpath 'com.android.tools.build:gradle:3.5.3'
+        classpath 'com.android.tools.build:gradle:7.3.0'
    }
```

## compileSdkVersionの変更
\android\app\build.gradle(上記とは別ファイル)で、必要に応じてcompileSdkVersionを上げる。
```
// build.gradle
android {
-    compileSdkVersion 29
+    compileSdkVersion 31
    ...
    }
```
他でインポートしているモジュール次第でminSdkVersionを上げる必要もあるかも


:::note warn

build.gradleを変更したときにIDE上で下記のポップアップが出るので、yesを選択する

- A build file was modified. Do you want to synchronize the Java classpath/configuration?
:::