Open13

Package of the Week メモ

K SAEKIK SAEKI
K SAEKIK SAEKI

Android は await deviceInfoPlugin().androidInfo で取得できる。
iOS も同様に await deviceInfoPlugin().iosInfo; で取得できる。

どちらも BaseDeviceInfo 型のサブクラスになっている。
よって、

BaseDeviceInfo device = Platform.isAndroid
    ? await deviceInfoPlugin().androidInfo
    : await deviceInfoPlugin().iosInfo;

という形でデータが取れる。

K SAEKIK SAEKI
K SAEKIK SAEKI

使い方は Icon ウィジェットと同じ。

  • Icon -> FaIcon
  • Icons -> FontAwesomeIcons

に変わるだけ。

  FaIcon(
    FontAwesomeIcons.github,
    size: 100,
    semanticLabel: 'GitHub',
    shadows: [Shadow(color: Colors.cyan, blurRadius: 10)],
  )

とかけば以下のように表示される。

GitHub

ただのフォントなので、独自にフォントを定義すれば同じように表示できる。

K SAEKIK SAEKI
K SAEKIK SAEKI

flutter_lintsrecommendeddart-lang/lintsrecommended を使っている。

K SAEKIK SAEKI

推奨ルールを見てみる。

annotate_override

クラスのメンバを上書きするときは override アノテーションをつける。
意図せずスーパークラスのメンバが上書きされてしまうのを防ぐ。

くわしく

公式ドキュメント

https://dart.dev/tools/linter-rules/annotate_overrides

悪い例

bad.dart
class Person {
  String get name => 'person';
}

class Koya extends Person {
  final String name = 'koya';
}

良い例

good.dart
class Person {
  String get name => 'person';
}

class Koya extends Person {
  
  final String name = 'koya';
}

avoid_function_literals_in_foreach_calls

関数リテラルに対して forEach を利用しない。
メリットがわからない。誰か教えてください。

くわしく

公式ドキュメント

https://dart.dev/tools/linter-rules/avoid_function_literals_in_foreach_calls

悪い例

bad.dart
countries.forEach((country) {
  ...
});

良い例

good.dart
for (var country in countries) {
  ...
}

avoid_init_to_null

変数の初期値を null と明示しない。
nullable な変数に初期値を設定しない場合は、暗黙的に null になる。
冗長で不要な表現なので初期値に null を明示的に設定しない。

くわしく

avoid_null_checks_in_equality_operators

カスタムの == 作用素で null チェックをしない。
Freezed などを使っているので意識したことない。
null は特別な値であり、
クラスのインスタンスが null と等しくなることはない。
Null は除くけど)
よって null 比較は冗長なのでいらない。

くわしく

公式ドキュメント

https://dart.dev/tools/linter-rules/avoid_null_checks_in_equality_operators

悪い例

bad.dart
class Person {
  final String? name;

  
  operator ==(Object? object) => other != null && other is Person && name == other.name;
}

良い例

good.dart
class Person {
  final String? name;

  
  operator ==(Object? object) => other != null && other is Person && name == other.name;
}

avoid_renaming_method_parameters

サブクラスで上書きした関数のパラメータ名を変更しない。
dart doc で生成するドキュメンテーションでパラメータが適切に設定できなくなるため。
そもそも読みづらいしな...。やらん方が良さそう。

くわしく

公式ドキュメント

https://dart.dev/tools/linter-rules/avoid_renaming_method_parameters

悪い例

bad.dart
class SuperClass {
  void foo(String bar) {}
}

class SubClass extends SuperClass {
  
  void foo(String baz) {}
}

良い例

good
class SuperClass {
  void foo(String bar) {}
}

class SubClass extends SuperClass {
  
  void foo(String bar) {}
}