analysis_options.yamlをカスタマイズする(2)

昨日の続きで、analysis_options.yamlの項目たちの説明です。 昨日の復習も含めて書いてゆきます。

analyzer:
  strong-mode:
    implicit-casts: false
    implicit-dynamic: false

動的型付け・型のキャストを許可する項目です。どちらもデフォルトはtrue
動的型付け・型のキャストを禁止したい時のみfalseで指定します。

implicit-casts: false

暗黙的な型変換を許可しない設定。

Object o = 'hoge';
String s = o;

ObjectクラスのインスタンスoStringクラスの変数sに代入しようとすると文字列をStringに入れるのでコンパイルは通るのですが、implicit-casts: falseに反して暗黙的な型変換が行われるのでアラートが発生するようになります。
アラートを避けるには、型変換が行われないよう変数の型を揃える必要があります。

String o = 'hoge';
String s = o;

implicit-dynamic: false

動的型付けを許可しない設定。
castsは型変換禁止なので、ObjectStringとなると静的型付だけどアラートが出るし、dynamicは動的型付け禁止なので、型をつけていないとアラートが出るという感じですね。

抜けがちなのは配列やオブジェクトの時かなと思いました。それぞれ要素の型を指定する必要があります。

// 1. hogeはListだけど、Listの中身を指定していないのでアラートが出る
final List hoge = ['hoge'];

// 1. Listの中身をジェネリクスで指定するとアラートが解消される
final List<String> hoge = ['hoge'];

// 2. MapのListだと指定しているけど、Mapの中身を指定していないので
// Missing type arguments for map literalアラートが出る
final List<Map> hoge = [{'fuga': 'piyo'}];

// 2. Mapの要素の型を再帰的に指定するとアラートが解消される
final List<Map<String, String>> hoge = [{'fuga': 'piyo'}];

// 3. 明示的にvarを指定するとアラートは出ない
var hoge = ['hoge'];

// ちなみにそもそもvarと型は共存できない(analysis_options.yamlによらず)
// これはコンパイルエラー
// "Variables can't be declared using both 'var' and a type name."
// var List hoge = ['hoge'];

関数呼び出しの際も、返り値のクラスを指定する必要があるようです。
たとえば、showDialogメソッドで返ってくるのはAwesomeDialogインスタンスなので指定します。

// アラートが出る
showDialog(
  context: context,
  builder: (_) {
    return AwesomeDialog();
  }
);

// 返り値のクラスを指定するとアラートが出なくなる
showDialog<AwesomeDialog>(
  context: context,
  builder: (_) {
    return AwesomeDialog();
  }
);

以上、動的型付け禁止の項目でした!