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
クラスのインスタンスo
をString
クラスの変数s
に代入しようとすると文字列をStringに入れるのでコンパイルは通るのですが、implicit-casts: false
に反して暗黙的な型変換が行われるのでアラートが発生するようになります。
アラートを避けるには、型変換が行われないよう変数の型を揃える必要があります。
String o = 'hoge'; String s = o;
implicit-dynamic: false
動的型付けを許可しない設定。
casts
は型変換禁止なので、Object
→String
となると静的型付だけどアラートが出るし、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(); } );
以上、動的型付け禁止の項目でした!