目次

use_build_context_synchronously

非同期ギャップを越えてBuildContextを使用しないでください。

このルールは Dart 2.13 以降で利用可能です。

ルールセット: flutter

詳細

#

非同期ギャップを越えてBuildContext使用しないでください

後で使用するためにBuildContextを保存すると、診断が難しいクラッシュにつながる可能性があります。非同期ギャップは暗黙的にBuildContextを保存しており、コードを作成する際に見落としやすいものです。

BuildContextが使用される場合、BuildContextへのアクセス方法に応じて、非同期ギャップ後にmountedプロパティを確認する必要があります。

  • Statecontextプロパティを使用する場合、Statemountedプロパティを確認する必要があります。
  • その他のBuildContextインスタンス(ローカル変数や関数引数など)の場合、BuildContextmountedプロパティを確認する必要があります。

悪い例

dart
void onButtonTapped(BuildContext context) async {
  await Future.delayed(const Duration(seconds: 1));
  Navigator.of(context).pop();
}

良い例

dart
void onButtonTapped(BuildContext context) {
  Navigator.of(context).pop();
}

良い例

dart
void onButtonTapped(BuildContext context) async {
  await Future.delayed(const Duration(seconds: 1));

  if (!context.mounted) return;
  Navigator.of(context).pop();
}

良い例

dart
abstract class MyState extends State<MyWidget> {
  void foo() async {
    await Future.delayed(const Duration(seconds: 1));
    if (!mounted) return; // Checks `this.mounted`, not `context.mounted`.
    Navigator.of(context).pop();
  }
}

使用法

#

use_build_context_synchronouslyルールを有効にするには、analysis_options.yamlファイルのlinter > rulesの下にuse_build_context_synchronouslyを追加します。

analysis_options.yaml
yaml
linter:
  rules:
    - use_build_context_synchronously