Open4
Null Safety
Kotlinのようにスマートキャストが効かないことに注意
以下だとコンパイルエラーとなる
void main() {
final total = sum(1, 2);
if (total == null) {
print('total is null');
}
print('total($total) * 2 = ${total * 2}');
}
int? sum(int a, int b) {
return a + b;
}
Error compiling to JavaScript:
Warning: Interpreting this as package URI, 'package:dartpad_sample/main.dart'.
lib/main.dart:8:38:
Error: Operator '*' cannot be called on 'int?' because it is potentially null.
print('total($total) * 2 = ${total * 2}');
^
Error: Compilation failed.
エクスクラメーションマーク(!)をつける必要がある
void main() {
final total = sum(1, 2);
if (total == null) {
print('total is null');
}
print('total($total) * 2 = ${total! * 2}');
}
int? sum(int a, int b) {
return a + b;
}
total(3) * 2 = 6
もしくは、nullでないことを保証するif文中に入れるか
void main() {
final total = sum(1, 2);
if (total == null) {
print('total is null');
}
if (total != null) {
print('total($total) * 2 = ${total * 2}');
}
}
int? sum(int a, int b) {
return a + b;
}
total(3) * 2 = 6
Never型を使えばスマートキャストのようにコンパイラが判定してくれる
以下では上記同様のコンパイルエラーが発生する
void main() {
final total = sum(1, 2);
if (total == null) {
throwError();
}
print('total($total) * 2 = ${total * 2}');
}
int? sum(int a, int b) {
return a + b;
}
void throwError() {
print('total is null');
throw Exception();
}
しかし、戻り値をNever型にすることでコンパイラが判定してくれる
void main() {
final total = sum(1, 2);
if (total == null) {
throwError();
}
print(total.runtimeType);
print('total($total) * 2 = ${total * 2}');
}
int? sum(int a, int b) {
return a + b;
}
Never throwError() {
print('total is null');
throw Exception();
}
int
total(3) * 2 = 6
クラスのプロパティがnullableだと単に以下ではダメそう(getter処理中で2回目にnullになる可能性があるから)
if (instance.value != null) {
print(instance.value);
}
!の名前はnull assertion operator
assert(text != null);とほぼ同じ意味で、(キャストというよりは)non-null promotion
参照: https://codewithandrea.com/articles/migrating-flutter-firebase-app-null-safety/
-
パッケージがnull safety対応してるかを確認する
flutter pub outdated --mode=null-safety
-
アップデート
flutter pub upgrade --null-safety
-
破壊的変更の修正
-
Riverpod 1.0.0- https://zenn.dev/riscait/books/flutter-riverpod-practical-introduction/viewer/migrate-to-v1
- Riverpodはエラーが出たので、以下のバージョンを使用した
- hooks_riverpod: ^0.14.0+4
- flutter_hooks: ^0.17.0
- flutter_dotenv 5.0.0
- iOS, Androidのビルド確認
cd ios
rm Podfile.lock
pod repo update
- dart migrate