Open4

Null Safety

lyalya

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
lyalya

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
lyalya

クラスのプロパティがnullableだと単に以下ではダメそう(getter処理中で2回目にnullになる可能性があるから)

if (instance.value != null) {
  print(instance.value);
}

!の名前はnull assertion operator
assert(text != null);とほぼ同じ意味で、(キャストというよりは)non-null promotion

lyalya

参照: https://codewithandrea.com/articles/migrating-flutter-firebase-app-null-safety/

  1. パッケージがnull safety対応してるかを確認する
    flutter pub outdated --mode=null-safety

  2. アップデート
    flutter pub upgrade --null-safety

  3. 破壊的変更の修正

  1. iOS, Androidのビルド確認
cd ios
rm Podfile.lock
pod repo update
  1. dart migrate